터미널에서 Ctrl+C를 실행할 때 터미널 창을 완전히 닫는 프로세스가 있는데, 왜 이런 일이 발생하는지 아는 사람이 있습니까?
이제 프로세스는 다음과 같이 시작됩니다.
exec "$(dirname "$0")/suman-shell" # a
이전에 시작된 방법은 다음과 같았습니다. 문제 없습니다.
"./$(dirname "$0")/suman-shell" # b
exec를 사용하면 터미널 창이 닫히는 것 같은데 왜 신호를 받은 후 닫히지 a
않고 닫히나요?b
답변1
일반적으로 모든 명령(셸 내장이 아님)은 서브셸에서 실행됩니다. 즉, 기본 프로세스가 분기되고 새 프로세스가 명령을 실행(가)하는 동안 기본 프로세스는 일반적으로 하위 프로세스가 완료될 때까지 기다립니다.
이것이 신호 전송 외에 하위 프로세스가 기본 프로세스에 영향을 미칠 수 없는 이유입니다.
내장 셸을 사용하여 명령을 실행하면 exec
기본 프로세스가 분기되지 않고 명령이 됩니다( syscall 을 통해 execve()
). 따라서 명령이 종료된 후에는 더 이상 돌아갈 기본 프로세스가 없습니다.
터미널 에뮬레이터의 관점에서 보면 셸이 종료되었으므로( exec
명령이 종료된 후) 창이 닫힙니다.