Bash에서 SIG_IGN 및 SIG_DFL에 신호 트랩을 어떻게 설정할 수 있습니까?

Bash에서 SIG_IGN 및 SIG_DFL에 신호 트랩을 어떻게 설정할 수 있습니까?

~에서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_IGNbash에서 신호 처리기를 설정하는 방법 과 신호 처리기를 빈 명령으로 설정하는 것이 ""로 설정하는 것과 동일한 지 이해하세요 SIG_IGN.

SIG_DFLBash에서 신호 트랩을 설정하는 방법에 대한 비슷한 질문입니다.

감사해요.

답변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 "" INTbashtrap - INT

관련 정보