프로그램을 실행하고 + 를 yes
눌러 프로세스를 중지했습니다.CtrlZ
그 후 kill -s 18 <pid>
.
그 후에는 Ctrl+를 사용하여 다시 중지 Z하거나 Ctrl+를 사용하여 죽일 수 없었습니다 C. 왜 그런 겁니까?
포 그라운드 및 백그라운드 프로세스를 관리하기 위해 쉘과 터미널이 어떻게 협력하는지에 관한 것입니다. 이것은 일어난 일입니다.
yes
대화 형 셸에서 실행합니다 . yes
별도의 프로세스 그룹 1 에서 생성 된 셸 . 쉘은 터미널 (터미널 에뮬레이터)에게 새 프로세스 그룹이 이제 포 그라운드에 있음을 알 렸습니다. 용어는 포 그라운드 프로세스 그룹 입니다. 쉘은 포 그라운드 프로세스 그룹이되는 것을 중지 한 자체 프로세스 그룹에 남아 있습니다. 셸은 터미널에서 읽기를 중단하여 효과적으로 백그라운드로 전환되었습니다.
Ctrl+ 시 Z터미널은 SIGSTP
포 그라운드 프로세스 그룹으로 전송 합니다. Ctrl+ C는 유사합니다. 신호는 SIGINT
있지만 포 그라운드 프로세스 그룹으로 이동합니다.
귀하의 경우 SIGSTP
에는 yes
프로세스 로 보냈습니다 . 프로세스가 중지되고 부모 (즉, 쉘)가를 수신 SIGCHLD
하여 반응 할 수 있습니다. 쉘은 터미널에 새로운 포 그라운드 프로세스 그룹이 쉘 중 하나임을 알리는 방식으로 반응했습니다. 쉘이 터미널에서 읽기를 재개했습니다. 이렇게하면 전경에 배치됩니다. 프롬프트를 인쇄하고 상호 작용할 수 있습니다.
그런 다음 실행 하여 프로세스 2로kill -s 18 …
보냈습니다 .SIGCONT
yes
받은 후 프로세스를 계속했다. 여전히 백그라운드에있었습니다. 즉, 프로세스 그룹이 포 그라운드 프로세스 그룹이되지 않았습니다. 그것은 그것이 전경에있을 때와 같이 콘솔에 인쇄되었습니다 3 . 전체 상황은 마치 처음과 같이 중지 를 배경에 놓거나 배경에서 실행하는 것과 같습니다 .SIGCONT
yes
yes
bg
yes &
껍데기는 전경에 남아있었습니다. 와 시도 Ctrl+ Z과 Ctrl+는 C단말기 전송하게 유지 SIGSTP
하고 SIGINT
쉘에 있습니다. 시 SIGINT
쉘 아마 인쇄 ^C
하고 프롬프트를 다시 썼다, 그러나 때문에 yes
매우 빠른 인쇄 (그리고 매우 빠른 터미널 스크롤) 당신이 통보하지 않았다.
그리고 아마도 쉘에 명령을 입력 할 수 있다는 것을 알지 못했을 것입니다. 를 입력 fg
Enter하면 쉘은 프로세스 그룹이 yes
새 포 그라운드 프로세스 그룹 임을 터미널에 알립니다 . 를 호출 한 직후와 마찬가지로 셸이 자체적으로 배경이됩니다 yes
. 그런 다음 + 또는 + 를 눌러 프로세스 SIGSTP
또는 프로세스에 보낼 수 있습니다 .SIGINT
yes
CtrlZCtrlC
시도 해봐.
1 단순 쉘 또는 비대화 형 쉘 (작업 제어가없는 경우)은 프로세스 그룹의 모든 것을 실행할 수 있습니다. 당신이 경험 yes
한 것은 별도의 프로세스 그룹에서 생성 되었음을 나타냅니다 .
2 Linux에서 숫자 18이 의미하는 정확한 신호는 아키텍처에 따라 다릅니다 (참조 man 7 signal
). 귀하의 설명을 통해 그것이 무엇인지 알 수 있습니다 SIGCONT
(의 출력을 조사하여 확인할 수 있습니다 kill -l
). 일반적으로 POSIX는 특정 신호에 몇 개의 숫자를 연결 하지만 18은이 숫자 SIGCONT
에 속하지 않으며 이러한 신호에 포함되지 않습니다. 보낼 수있는 대부분의 휴대용 방법은 SIGCONT
함께 kill -s CONT
하지 않는 번호. 이것은 모든 POSIX 호환 (또는 거의 POSIX 호환) OS에서 작동합니다.
3 백그라운드의 프로세스는 일반적으로 제어 터미널에 쓸 수 있습니다. 읽을 수 없습니다. 조사 SIGTTOU
및SIGTTIN
자세한 사항은 여기 정교하지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다