If I have the following shell script
sleep 30s
And I hit Ctrl+C when the shell script is running, the sleep
dies with it.
If I have the following shell script
sleep 30s &
wait
And I hit Ctrl+C when the shell script is running, the sleep
continues on, and now has a parent of 1.
Why is that? Doesn't bash propagate Ctrl+C to all the children?
EDIT:
If I have the following script
/usr/bin/Xvfb :18.0 -ac -screen 0 1180x980x24 &
wait
where I am spawning a program, this time Ctrl+C on the main process kills the Xvfb
process too.
So how/why is Xvfb
different from sleep?
In the case of some processes I see that they get reaped by init
, in some cases they die. Why does sleep get reaped by init? Why does Xvfb
die?
Best Answer
tl;dr; the
Xvfb
process sets a signal handler forSIGINT
and exits when it receives such a signal, but thesleep
process doesn't, so it inherits the "ignore" state forSIGINT
as it was set by the shell running the script before executing thesleep
binary.When a shell script is run, the job control is turned off, and background processes (the ones started with
&
) are simply run in the same process group, withSIGINT
andSIGQUIT
set toSIG_IGN
(ignored) and with their stdin redirected from/dev/null
.This is required by the standard:
If the signal disposition is set to
SIG_IGN
(ignore), that state will be inherited throughfork()
andexecve()
: