Restaurante La Strada

sigaction 예제

Posted on

재진입하지 않는 함수 호출을 중단하는 데 서 발생하는 오류를 방지하기 위해 응용 프로그램은 적절한 신호를 차단하거나 일부 프로그래밍 방식의 세마포어(semget(참조) , sem_init(sem_init(sem_init() 및 sem___를 사용하여 이러한 함수에 대한 호출을 보호해야 합니다. open() 등등) 특히 “안전한” 기능조차도 errno를 수정할 수 있습니다. 독립 스레드로 실행되지 않는 경우 신호 catch 함수는 값을 저장하고 복원할 수 있습니다. 당연히 동일한 원칙이 응용 프로그램 루틴및 비동기 데이터 액세스의 재진입에 적용됩니다. longjmp() 및 siglongjmp()는 재진입 함수 목록에 없습니다. longjmp() 및 siglongjmp() 후에 실행되는 코드는 신호 처리기에서 직접 안전하지 않은 함수를 호출하는 것과 동일한 위험의 안전하지 않은 함수를 호출할 수 있기 때문입니다. 신호 처리기 내에서 longjmp() 및 siglongjmp()를 사용하는 응용 프로그램은 휴대용이 되기 위해 엄격한 보호가 필요합니다. 목록에서 제외되는 다른 많은 함수는 전통적으로 malloc() 또는 free() 함수 또는 표준 I/O 라이브러리를 사용하여 구현되며, 이 두 함수는 모두 전통적으로 비재진입 방식으로 데이터 구조를 사용합니다. 공통 데이터 구조를 사용하는 서로 다른 함수의 조합으로 인해 재진입 문제가 발생할 수 있으므로 IEEE Std 1003.1-2001의 이 볼륨은 안전하지 않은 함수를 방해하는 신호 처리기에서 안전하지 않은 함수를 호출할 때 동작을 정의하지 않습니다. 일부 기록 구현은 ptrace() 함수와 같은 프로세스를 중지하기 위한 다른 메커니즘도 정의합니다. 이러한 구현은 일반적으로 이 메커니즘으로 인해 프로세스가 중지될 때 SIGCHLD 신호를 생성하지 않습니다.

그러나, 그것은 IEEE Std 1003.1-2001의이 볼륨의 범위를 벗어납니다. 여기서 signo가 신호 잡기 함수에 대한 유일한 인수입니다. 이 경우 응용 프로그램은 sa_handler 멤버를 사용하여 신호 잡기 함수를 설명하고 응용 프로그램은 sa_sigaction 멤버를 수정하지 않아야 합니다. 여기서 sig는 신호 번호이고, 코드는 특정 신호에 대한 추가 정보이고, scp는 시그컨텍스트 구조에 대한 포인터이며, 추가는 추가 주소 정보이다. SA_SIGINFO가 설정될 때 지정된 신호 처리기의 두 번째 인수로 가리키는 개체에서 거의 동일한 정보를 사용할 수 있습니다. si_signo, si_errno 및 si_code는 모든 신호에 대해 정의됩니다. (si_signo는 리눅스에서 사용되지 않습니다.) 구조체의 나머지 는 공용 구조체일 수 있으므로 지정된 신호에 대해 의미 있는 필드만 읽어야 합니다. POSIX.1b 신호와 SIGCHLD는 si_pid 및 si_uid를 채웁니다. SIGCHLD는 또한 si_status, si_utime 및 si_stime을 채웁니다.

si_int 및 si_ptr은 POSIX.1b 신호의 발신자에 의해 지정됩니다. SIGILL, SIGFPE, SIGSEGV 및 SIGBUS는 si_addr에 오류 주소를 입력합니다. SIGPOLL은 si_band와 si_fd를 채웁니다. sig에 대한 이전 작업이 signal()에 의해 설정된 경우 oact가 가리키는 구조에서 반환되는 필드의 값은 지정되지 않으며, 특히 oact-> sa_handler는 반드시 signal()에 전달된 동일한 값이 아닙니다.