Ctrl+를 누르면 C 신호가 SIGINT
다음으로 전송된다는 것을 읽었습니다.포그라운드 프로세스 그룹.
이 작업을 수행하는 방법에 대한 예를 들어주실 수 있나요?포그라운드 프로세스 그룹Ctrl왜냐하면 +를 누르면 모든 프로세스가 종료되는지 확인하고 싶기 때문입니다 C.
답변1
~부터새로운 프로세스는 모두 동일한 프로세스 그룹에 속합니다., 상위 프로세스, 하나의 프로세스가 여러 프로세스( fork
)를 시작하도록 한 다음 적절한 로깅 및 지연을 사용하여 Ctrl+ 를 입력합니다 C. 다들 하나씩 먹어요 SIGINT
.
$ perl -E 'fork for 1..2;say "ima $$"; $SIG{INT}=sub{die "woe $$\n"}; sleep 999'
ima 80920
ima 80922
ima 80921
ima 80923
^Cwoe 80920
woe 80922
woe 80921
woe 80923
$
( 어떤 시스템 호출이나 신호가 관련되어 있는지 확인하려면 추가 strace
하거나 기다리세요.)sysdig
답변2
ㅏ배관공은 직업이다, 여러 프로세스 포함:
(cat ; echo foo >&2) | (cat ; echo bar >&2 )
Ctrl+로 입력을 종료하면 및 출력을 D얻게 되며 , +로 파이프를 종료하면 둘 다 인쇄되지 않습니다.foo
bar
CtrlC
답변3
한 가지 예:
bash-4.3$ ( ( sleep 2 & (ps -Hfj | sh -c cat; perl -MPOSIX -E 'say tcgetpgrp 0'; sleep 5;:);:);:)
UID PID PPID PGID SID C STIME TTY TIME CMD
chazelas 18631 3848 18631 18631 0 12:51 pts/7 00:00:00 /bin/zsh
chazelas 2184 18631 2184 18631 0 21:00 pts/7 00:00:00 bash --norc
chazelas 2430 2184 2430 18631 0 21:07 pts/7 00:00:00 bash --norc
chazelas 2431 2430 2430 18631 0 21:07 pts/7 00:00:00 bash --norc
chazelas 2432 2431 2430 18631 0 21:07 pts/7 00:00:00 sleep 2
chazelas 2433 2431 2430 18631 0 21:07 pts/7 00:00:00 bash --norc
chazelas 2434 2433 2430 18631 0 21:07 pts/7 00:00:00 ps -Hfj
chazelas 2435 2433 2430 18631 0 21:07 pts/7 00:00:00 sh -c cat
chazelas 2436 2435 2430 18631 0 21:07 pts/7 00:00:00 cat
2430
당시 실행 중일 때 ps
2430 프로세스 그룹에는 7개의 프로세스가 있었습니다: 3개의 서브쉘 프로세스( bash
), 1개 실행 중 ps
, 1개 실행 중 , sh
1 cat
개 실행 중 sleep 1
. 나중에 이러한 프로세스가 생성되고 실행 perl
되며 sleep 5
동일한 그룹에 속하게 됩니다.
tcgetpgrp()
2430이 실제로 단말 장치의 포그라운드 프로세스 그룹인지 확인하세요. 그러면 해당 그룹의 모든 프로세스는 를 누르면 Ctrl+CSIGINT를 받게 됩니다 .