
에서https://unix.stackexchange.com/a/447032/674
따라서 코드 측면에서
SIGINT
신호를 가정하면 다음 세 가지 옵션이 있습니다.
signal(SIGINT, SIG_IGN);
무시하다- 함수 를 호출하지 않거나
signal()
호출하여signal(SIGINT, SIG_DFL);
기본 동작이 발생하도록 합니다. 즉, 프로세스를 종료합니다.signal(SIGINT, termination_handler);
, 여기서 는termination_handler()
신호가 처음 발생할 때 호출되는 함수입니다.
Bash에서 신호 처리기를 어떻게 설정할 수 있습니까 SIG_IGN
?
trap "" INT
빈 명령을 ""
신호 처리기로 설정합니다. 하지만 실제로 핸들러를 로 설정합니까 SIG_IGN
?
Bash가 외부 명령을 실행하면 신호 트랩을 기본값으로 재설정하고 무시된 신호는 계속 무시됩니다. 따라서 SIG_IGN
bash에 신호 처리기를 설정하는 방법과 신호 처리기를 빈 명령으로 설정하는 것이 로 ""
설정하는 것과 같은지 아는 것이 중요합니다 SIG_IGN
.
Bash 에 신호 트랩을 설정하는 방법에 대한 비슷한 질문입니다 SIG_DFL
.
감사해요.
답변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