Ctrl+C가 SIGINT 신호를 여러 프로세스에 보낼 수 있습니까?

Ctrl+C가 SIGINT 신호를 여러 프로세스에 보낼 수 있습니까?

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얻게 되며 , +로 파이프를 종료하면 둘 다 인쇄되지 않습니다.foobarCtrlC

답변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

당시 실행 중일 때 ps2430 프로세스 그룹에는 7개의 프로세스가 있었습니다: 3개의 서브쉘 프로세스( bash), 1개 실행 중 ps, 1개 실행 중 , sh1 cat개 실행 중 sleep 1. 나중에 이러한 프로세스가 생성되고 실행 perl되며 sleep 5동일한 그룹에 속하게 됩니다.

tcgetpgrp()2430이 실제로 단말 장치의 포그라운드 프로세스 그룹인지 확인하세요. 그러면 해당 그룹의 모든 프로세스는 를 누르면 Ctrl+CSIGINT를 받게 됩니다 .

관련 정보