programing

리눅스: sig_atomic_type이 int로 지정되는 이유는 무엇입니까?

muds 2023. 10. 23. 22:09
반응형

리눅스: sig_atomic_type이 int로 지정되는 이유는 무엇입니까?

내 리눅스 박스에,sig_atomic_t평범한 늙은이입니다.int. 도ints특별한 원자질을 가지고 있습니까?

$ gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
...
Thread model: posix
gcc version 4.3.2 (Debian 4.3.2-1.1) 

$ echo '#include <signal.h>' | gcc -E - | grep atomic
typedef int __sig_atomic_t;
typedef __sig_atomic_t sig_atomic_t;

C99sig_atomic_tC99는 동시성의 개념이 없고 중단성만 있기 때문에 매우 약한 "원자성"의 정의에만 부합합니다.(C2011은 동시성 모델을 추가하고, 이와 함께_Atomic더 강력한 보장을 해주는 유형들. 그러나 AFAIK.sig_atomic_t존재 이유가 스레드 간의 통신이 아닌 신호 처리기와의 통신이기 때문에 변경되지 않습니다.

이것이 C99가 말하는 모든 것입니다.sig_atomic_t:

(§7.14<signal.h>, 제2항) 정의된 유형은sig_atomic_t, 이것은 비동기 인터럽트가 있는 경우에도 원자 실체로서 접근할 수 있는 물체의 (possibly 휘발성 자격을 갖춘) 정수형입니다. (§7.14)<signal.h>, 제2항)

(§7.14p5) 호출 결과 이외에 [a] 신호가 발생한 경우abort아니면raise함수, 신호 처리기가 다음과 같이 선언된 개체에 값을 할당하는 것 이외의 정적 저장 지속 시간을 가진 개체를 참조하면 동작이 정의되지 않습니다.volatile sig_atomic_t.

(§7.18.3 기타 정수 형식의 제한, 3항) 다음과 같은 경우sig_atomic_t(7.14 참조)는 부호가 있는 정수형으로 정의되며, 값은SIG_ATOMIC_MIN-127보다 크지 않아야 하며 값은SIG_ATOMIC_MAX127 이상이어야 하며, 그렇지 않으면 sig_atomic_t는 부호 없는 정수형으로 정의되며, 값은SIG_ATOMIC_MIN0이어야 하며 값은SIG_ATOMIC_MAX255 이상이어야 합니다.

"원자 실체"라는 용어는 표준 어디에도 정의되어 있지 않습니다.standard-ese에서 번역하면 CPU가 유형의 변수를 완전히 업데이트할 수 있습니다.sig_atomic_t하나의 기계 명령으로 메모리("정적 저장 기간")에 저장됩니다.따라서, 동시성이 없는 정확하게 인터럽트 가능한 C99 추상 기계에서, 신호 처리기가 유형의 변수를 관찰하는 것은 불가능합니다.sig_atomic_t 최신 정보의 중간에§7.18.3p3 언어는 다음과 같이 작도록 라이센스를 부여합니다.char필요하면.프로세서 간 일관성과 관련된 언어는 전혀 없습니다.

보다 큰 값을 쓰기 위해 둘 이상의 명령이 필요한 실제 CPU가 있습니다.char기억에 남습니다.머신 워드보다 작은 값을 쓰기 위해 둘 이상의 명령어가 필요한 실제 CPU도 있습니다.int를 기억합니다.GNU C 라이브러리 설명서의 언어는 이제 정확하지 않습니다.이것은 C 구현이 애플리케이션 프로그래머들의 삶을 더 힘들게 만드는 이상한 일을 하기 위해 불필요한 라이센스라고 생각했던 것을 없애려는 원저자들의 바람을 나타냅니다.불행하게도, 바로 그 라이센스가 어떤 실제 기계에서 C를 아예 가질 수 있게 해주는 것입니다.(AVR에 대한) 내장된 Linux 포트가 하나 이상 있지만 둘 다 포함되지 않습니다.int어떤 포인터도 하나의 명령으로 메모리에 쓸 수 없습니다. (사람들은 매뉴얼을 더 정확하게 만들기 위해 노력하고 있습니다. 예를 들어, http://sourceware.org/ml/libc-alpha/2012-02/msg00651.html --sig_atomic_t하지만 그것에서는 놓친 것 같습니다.)

특정 유형에서는 읽기/쓰기에 여러 지침이 필요할 수 있습니다.inttype은 항상 원자적으로 읽거나 씁니다.

자료종류 : sig_atomic_t

정수 데이터 형식입니다.이 유형의 개체는 항상 원자적으로 액세스됩니다.

실제로 int와 다른 정수형은 int보다 길지 않다고 가정할 수 있습니다.포인터 유형이 원자형이라고 가정할 수도 있습니다. 이는 매우 편리합니다.이 두 가지 모두 GNU C 라이브러리가 지원하는 모든 기계와 우리가 알고 있는 모든 POSIX 시스템에서 사실입니다.

언급

언급URL : https://stackoverflow.com/questions/9606725/linux-why-is-sig-atomic-t-typedefed-to-int

반응형