我读过,当您按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
A管道是一项工作,具有多个进程:
(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个子shell进程(bash
),1个正在运行ps
,1个正在运行sh
,1个正在运行cat
,1个正在运行sleep 1
。稍后,这些进程会生成并执行perl
,并且sleep 5
也将位于同一组中。
tcgetpgrp()
确认 2430 确实是终端设备的前台进程组,因此按下 后Ctrl+C,该组中的所有进程都会收到 SIGINT。