%60%EA%B0%80%20%EC%8B%A0%ED%98%B8%20%EC%B2%98%EB%A6%AC%EB%A5%BC%20%EC%B2%98%EB%A6%AC%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%84%20%EC%B6%94%EA%B0%80%EB%A1%9C%20%EB%B3%80%EA%B2%BD%ED%95%98%EC%A7%80%20%EC%95%8A%EA%B3%A0%20%60execve()%60%EB%A5%BC%20%ED%98%B8%EC%B6%9C%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
Bash 매뉴얼에 따르면
내장 함수나 쉘 함수가 아닌 간단한 명령을 실행하려고 하면 ... 쉘이 잡은 트랩을 다음과 같이 재설정합니다.쉘의 부모로부터 상속된 값, 쉘이 무시한 트랩은 무시됩니다.
execve(2) 동안 처리된 신호의 처리는 다음과 같이 재설정됩니다.기본값; 무시된 신호의 처리는 변경되지 않고 그대로 유지됩니다."
"기본값"과 "쉘의 부모로부터 상속된 값"은 동일합니까?
신호 처리 execve()
방법을 추가로 변경하지 않고 bash를 호출합니까 ?execve()
감사해요.
답변1
아니요, "기본값"과 "쉘의 부모로부터 상속된 값"은 동일하지 않습니다. execve의 경우 "기본값"은 SIG_DFL
다음과 같이 지정된 기본 작업을 발생시키는 을 나타냅니다.man 7 signal
. bash의 경우 "쉘의 부모로부터 상속된 값"은 그것이 말하는 것과 정확히 같습니다. 그러한 신호가 SIG_IGN
부모에 의해 무시되면( ) 자식에서도 무시됩니다.
여기서 무슨 일이 일어나고 있는지 이해하는 열쇠는 "처리됨"이라는 단어입니다. 이는 SIG_DFL
또는 와 구별되는 사용자 정의 신호 처리기 함수를 나타냅니다 SIG_IGN
. 새 프로세스에는 이전 프로세스에서 사용했던 신호 처리기 기능이 없으므로 execve로 재설정해야 합니다.
execve 맨페이지의 최신 버전에서는 나머지 Linux에서 사용되는 용어와 일치하도록 "처리된" 신호를 "잡힌" 신호로 참조합니다. 이는 기본 신호 및 무시된 신호와는 여전히 다릅니다.
간단한 버전: bash 또는 bash의 부모 중 하나에 로 표시된 신호가 있으면 새 자식에도 SIG_IGN
해당 신호가 표시됩니다 . 그렇지 않으면 새 자식에 SIG_IGN
있게 됩니다 . SIG_DFL
새로운 자식에는 bash나 그 부모의 핸들러가 존재하지 않기 때문에 새로운 자식에서는 핸들러가 될 수 없습니다.