4

I have read that when you press Ctrl+C a SIGINT signal will be sent to the foreground process group.

Can you give me an example of how I can have two or more processes in the foreground process group, because I want to see if all processes will terminate if I press Ctrl+C.

Josh Correia
  • 236
  • 2
  • 8
Steve
  • 777
  • 1
  • 7
  • 15

3 Answers3

2

A pipeline is one job, with multiple processes:

(cat ; echo foo >&2) | (cat ; echo bar >&2 )

If you end the input with Ctrl+D, you get the foo and bar output, if you kill the pipeline with Ctrl+C, neither is printed.

Josh Correia
  • 236
  • 2
  • 8
ilkkachu
  • 133,243
  • 15
  • 236
  • 397
2

Since new processes all belong to the same process group, that of the parent process, have a process start a bunch of processes (fork), and then with appropriate logging and a delay, type Ctrl+C. They all eat a 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
$ 

(Add strace or sysdig or such to see the system calls or signals involved.)

Josh Correia
  • 236
  • 2
  • 8
thrig
  • 34,333
  • 3
  • 63
  • 84
  • How can a process start more than one process, I mean wouldn't the parent process block until the first child process is terminated? – Steve May 16 '17 at 19:59
  • `fork` makes two processes from one process. The parent can but need not block by calling some `wait` function. The above `perl` processes do not block on anything, they just all go to sleep. – thrig May 16 '17 at 20:07
  • I can also just make the parent process start only one child process, and then press `Ctrl+C` one time to terminate both the parent and child processes (I tried it and it worked). – Steve May 17 '17 at 12:42
0

One example:

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

At the time ps was running, there were 7 processes in the 2430 process group: 3 subshell processes (bash), one running ps, one running sh, one running cat, one running sleep 1. Later on, the processes spawned to execute perl and sleep 5 would also be in that same group.

tcgetpgrp() confirms that 2430 was indeed the foreground process group of the terminal device, so upon pressing Ctrl+C, all the processes in that group would receive a SIGINT.

Stéphane Chazelas
  • 522,931
  • 91
  • 1,010
  • 1,501