~에서https://unix.stackexchange.com/a/447032/674
따라서 코드 측면에서
SIGINT
신호를 가정하면 세 가지 옵션이 있습니다.
signal(SIGINT, SIG_IGN);
소홀히 하다- 함수 를 호출하지 마십시오
signal()
. 또는signal(SIGINT, SIG_DFL);
and를 사용하여 호출하지 마십시오. 프로세스를 종료하는 기본 동작이 발생하도록 허용하십시오.signal(SIGINT, termination_handler);
,termination_handler()
신호가 처음 발생할 때 호출되는 함수는 어디에 있습니까?
Bash에서 신호 핸들러를 어떻게 설정합니까 SIG_IGN
?
trap "" INT
빈 명령을 ""
신호 처리기로 설정합니다. 하지만 실제로 핸들러를 로 설정합니까 SIG_IGN
?
bash가 외부 명령을 실행할 때 신호 트랩을 기본값으로 재설정하고 무시된 신호는 계속 무시됩니다. 따라서 SIG_IGN
bash에서 신호 처리기를 설정하는 방법 과 신호 처리기를 빈 명령으로 설정하는 것이 ""
로 설정하는 것과 동일한 지 이해하세요 SIG_IGN
.
SIG_DFL
Bash에서 신호 트랩을 설정하는 방법에 대한 비슷한 질문입니다.
감사해요.
답변1
POSIX 문서에서특수 내장 유틸리티trap
:
action 이 인 경우
-
쉘은 각 조건을 기본값으로 재설정합니다. action이 null(""
)인 경우 쉘은 지정된 조건이 발생할 때마다 무시합니다. 그렇지 않으면 해당 조건 중 하나가 발생할 때 셸에서 인수 작업을 읽고 실행해야 합니다.
이는 이후의 스크립트가 신호를 trap "" INT
무시 INT
하고 를 사용하여 트랩을 기본값으로 재설정할 수 있음을 의미합니다 trap - INT
.
답변2
나는 다음 스크립트를 사용했습니다.
#!/bin/bash
trap "" INT
trap - INT
그리고 다음을 실행하세요:
$ strace bash script.sh 2>&1 | grep INT
출력에서 다음을 볼 수 있습니다.
read(3, "#!/bin/bash\ntrap \"\" INT\ntrap - I"..., 80) = 35
read(255, "#!/bin/bash\ntrap \"\" INT\ntrap - I"..., 35) = 35
rt_sigaction(SIGINT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, 8) = 0
sa_handler=SIG_IGN
첫 번째 호출의 오류 rt_sigaction()
와 두 번째 호출의 오류를 고려하면 신호가 무시되고 기본 처리기로 재설정되는 것처럼 sa_handler=SIG_DFL
보입니다 .trap "" INT
bash
trap - INT