cat 명령을 백그라운드 프로세스로 실행하면,
$ cat &
그럼 죽여보려고 해
$ killall -v cat
15번 신호로 고양이를 죽였다고 했는데, 고양이가 막 막혔어요. 실행한 후에도 $ ps
여전히 실행 중인 것을 볼 수 있습니다. 전화를 하고 나서야 $ fg
비로소 서비스가 종료되었습니다.
C++에서 고양이를 시뮬레이션할 때 입력을 기다리는 것과 관련이 있는 것 같습니다.
string line;
while(getline(cin, line))
cout << line << endl;
같은 일이 발생하지만 간단한 while(true);
루프를 사용하면 프로세스가 성공적으로 종료됩니다.
$ cat
또한 다른 터미널에서 실행하면 $ killall -v cat
정상적으로 작동하기 때문에 백그라운드 프로세스인 것 같습니다.
여기서 무슨 일이 일어나고 있는 걸까요? 미리 감사드립니다.
답변1
당신이 달릴 때
cat &
다음과 같은 메시지가 표시되어야 합니다.
[1]+ Stopped cat
그 직후(아마도 다른 작업 번호로). 이는 표준 입력에서 읽기를 시도하기 때문에 cat
백그라운드에서 실행되는 동안 결국 중지됩니다.
SIGKILL
중지된 프로세스는 재개될 때까지 신호를 받지 않습니다. (계속). 이것이 여기서 일어나는 일입니다. SIGTERM
프로세스가 계속될 때만 데이터가 전달되며, 데이터를 포그라운드로 되돌릴 때 이런 일이 발생합니다.