무시되지 않는 트랩은 서브쉘에 들어갈 때 기본 동작으로 설정되어야 합니다.
원천:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_28
분명히 쉘에서 호출하는 외부 프로그램의 경우에도 마찬가지입니다. trap "" SIGNAL
이 신호를 포착(무시)하기 위해 노력하세요. 그러나 trap action SIGNAL
호출되지 않고 action
아무 작업도 수행하지 않으며 신호 처리가 원래 기본값으로 설정된 것으로 보입니다.
이 동작은 어디에 정의되어 있나요?
답변1
trap
signal()
이는 쉘의 내장 기능이며 / 에 대한 인터페이스를 제공합니다 sigaction()
. 이런 점에서 외부 명령은 신호 구성을 변경하는 다른 언어와 동일하게 동작합니다.
시스템 호출을 통해 다른 명령을 실행 하면 execve()
프로세스(신호 처리기의 코드 포함)의 메모리(코드 포함)가 지워지고 새로운 실행 파일의 코드로 대체되므로 신호 처리기가 살아남을 수 없습니다.
호출 프로세스 이미지에서 기본 동작( )으로 설정된 시그널을
SIG_DFL
새로운 프로세스 이미지에서도 기본 동작으로 설정해야 합니다. 예외적으로SIGCHLD
, 호출된 프로세스 이미지에 의해 무시()로 설정된 신호는SIG_IGN
새로운 프로세스 이미지에 의해 무시되도록 설정되어야 합니다.호출 프로세스 이미지에 의해 캡처되도록 설정된 신호는 새 프로세스 이미지에서 기본 작업으로 설정되어야 합니다.(바라보다<signal.h>
).
SIGCHLD
호출 프로세스 이미지에서 신호를 무시하도록 설정 한 경우SIGCHLD
신호가 무시되도록 설정되었는지 아니면 새 프로세스 이미지에서 기본 작업으로 설정되었는지는 지정되지 않습니다.
trap '' NAL
SIG_IGN
신호 및 배치를 설정합니다 trap - NAL
SIG_DFL
.
trap
추가 요구 사항이 있습니다(이 중 다수는 제한 사항으로 간주되어 일부 셸 구현에서는 무시될 수 있음).
- 프로세스가 분기될 때 신호 처리기를 상속하지만 셸에서는 처리기가 하위 셸에서 재설정됩니다. 이는 부모와 자식에게 자주 전송되지만 때로는 전송되지 않는 SIGINT/SIGQUIT/SIGHUP/SIGTSTP와 같은 일부 신호에 유용합니다.
- POSIX 셸에서는 시작 시 무시된 신호 처리기를 사용자가 복원하는 것을 허용하지 않습니다.
- 비동기 명령의 일부 신호는 자동으로 무시됩니다.
- SIGCHLD와의 혼합은 일반적으로 쉘이 자체적으로 처리하기 때문에 작동하지 않습니다.
- 나는 쉘 스크립트의 신호 처리가 종종 신뢰할 수 없고 이식성이 없다는 것을 항상 발견했습니다.