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);기본 동작이 발생하도록 합니다. 즉, 프로세스를 종료합니다.
  • signal(SIGINT, termination_handler);, 여기서 는 termination_handler()신호가 처음 발생할 때 호출되는 함수입니다.

Bash에서 신호 처리기를 어떻게 설정할 수 있습니까 SIG_IGN?

trap "" INT

빈 명령을 ""신호 처리기로 설정합니다. 하지만 실제로 핸들러를 로 설정합니까 SIG_IGN?

Bash가 외부 명령을 실행하면 신호 트랩을 기본값으로 재설정하고 무시된 신호는 계속 무시됩니다. 따라서 SIG_IGNbash에 신호 처리기를 설정하는 방법과 신호 처리기를 빈 명령으로 설정하는 것이 로 ""설정하는 것과 같은지 아는 것이 중요합니다 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 "" INTbashtrap - INT

관련 정보