슈뢰딩거의 고양이

슈뢰딩거의 고양이

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프로세스가 계속될 때만 데이터가 전달되며, 데이터를 포그라운드로 되돌릴 때 이런 일이 발생합니다.

관련 정보