Jay Taylor's notes
back to listing indexSignalTrap - Greg's Wiki
[web search]trap 'rm -f "$tempfile"; trap - INT; kill -INT $$' INT
We can see the difference between a properly behaving process and a misbehaving process. On most operating systems, ping is an example of a misbehaving process. It traps SIGINT in order to display a summary at the end, before exiting. But it fails to kill itself with SIGINT, and so the calling shell does not know that it should abort as well. For example,
# Bash. Linux ping syntax. for i in {1..254}; do ping -c 2 192.168.1.$i done
Here, if the user presses Ctrl-C during the loop, it will terminate the current ping command, but it will not terminate the loop. This is because Linux's ping command does not kill itself with SIGINT in order to communicate to the caller that the SIGINT was fatal. (Linux is not unique in this respect; I do not know of any operating system whose ping command exhibits the correct behavior.)
A properly behaving process such as sleep does not have this problem:
i=1 while [ $i -le 100 ]; do printf "%d " $i i=$((i+1)) sleep 1 done echo
If we press Ctrl-C during this loop, sleep will receive the SIGINT and die from it (sleep does not catch SIGINT). The shell sees that the sleep died from SIGINT. In the case of an interactive shell, this terminates the loop. In the case of a script, the whole script will exit, unless the script itself traps SIGINT.
SignalTrap (last edited 2017-05-28 22:24:18 by 104)