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
$ 

(添加stracesysdig等以查看涉及的系统调用或信号。)

答案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。

相关内容