상위 프로세스는 SIGINT를 받은 후 기본 작업을 수행하지 않습니다.

상위 프로세스는 SIGINT를 받은 후 기본 작업을 수행하지 않습니다.

bash에서 +를 사용하여 CtrlSIGINT에 대해 2가지 테스트를 수행했습니다 .C

테스트 1

상위 및 하위 스크립트 모두 를 통해 핸들러를 설정합니다 trap.

# !/bin/bash
# Parent.sh
trap 'echo "I handled the SIGINT in Parent.sh and expect the script going ahead."' SIGINT
echo 1.1
./Child.sh
echo 1.2
# !/bin/bash
# Child.sh
trap 'echo "I handled the SIGINT in Child.sh and expect the script going ahead."' SIGINT
echo 2.1
sleep 1000000000
echo 2.2
/tmp:$ ./Parent.sh
1.1
2.1
^CI handled the SIGINT in Child.sh and expect the script going ahead.
2.2
I handled the SIGINT in Parent.sh and expect the script going ahead.
1.2

출력은 제가 예상했던 것과 거의 같습니다.

테스트 2

하위 스크립트만 설정 핸들러를 전달합니다 trap.

# !/bin/bash
# Parent.sh
# trap 'echo "I expect I will be terminated immediately after Child.sh died."' SIGINT
echo 1.1
./Child.sh
echo "sleep started"
sleep 5
echo "sleep finished"
echo 1.2
# !/bin/bash
# Child.sh
trap 'echo "I handled the SIGINT in Child.sh and expect the script going ahead."' SIGINT
echo 2.1
sleep 1000000000
echo 2.2
/tmp:$ ./Parent.sh
1.1
2.1
^CI handled the SIGINT in Child.sh and expect the script going ahead.
2.2
sleep started
sleep finished
1.2

나는 Parent.sh이것이 사망 후 즉시 종료되어야 한다고 예상했습니다(SIGINT의 기본 조치로) Child.sh.

하지만 SIGINT를 받은 것 같지만 Parent.sh무시합니다.

왜 그럴까요?

답변1

이런 일이 일어나는 이유는"기다리고 협력해서 나가세요"(WCE) bash구현.

bash가 SIGINT하위 프로세스를 기다리는 동안 신호를 받으면 해당 신호로 인해 하위 프로세스가 종료되는 경우에만(하위 프로세스가 종료될 때가 아니라) 스스로 종료됩니다. 상위 WIF*프로세스는 하위 프로세스의 종료 상태를 통해 처리되지 않은 신호로 인해 종료되었는지 아니면 종료되었는지 확인할 수 있습니다.wait(2)맨페이지.

더 간단한 예:

bash -c 'sh -c "trap exit INT; read p"; echo DONE'
<ctrl-C>
DONE

그리고dashWCE를 구현하지 않는 쉘:

dash -c 'sh -c "trap exit INT; read p"; echo DONE'
<ctrl-C>
<no DONE, parent script was killed outright>

비슷한 것 좀 봐Q&A,게다가함께 모으다해결 방법으로 이것을 제안합니다.

관련 정보