使用陷阱来捕获这样的信号:
i=-1;while((++i<33)); do trap "echo $i >> log.txt" $i; done
并用力关闭终端.
然后log.txt中的内容(在redhat linux下):
1
18
1
17
0
这些信号来自哪里?
第一个信号是SIGHUP;当终端断开连接时,它会被发送到进程组中的所有进程(挂起 – 因此是HUP).
第二个信号是SIGCONT(谢谢,SiegeX,数字).这有点令人惊讶;它表明你有一份工作在后台停止,必须允许再次运行.
第三个信号是另一个SIGHUP.这很可能是为了确保继续流程能够退出,但却被发送到整个流程组. (有关过程组的信息,请参阅POSIX标准等).
第四个信号是SIGCHLD,表明子进程已经死亡并且尸体可用(嗯,状态可用).
最终信号0是壳内部伪信号,表示它正在退出.
你可以做:
trap 'echo Bye' 0
当shell出于任何原因退出控制时,回应’再见’.您选择将信号编号回显到文件中.由于shell在此时退出,这是最后看到的信号消息.其父进程应该获得SIGCHLD信号,因为shell死了.
FWIW,在MacOS X 10.6.7上,我运行了你的测试. MacOS X上没有信号32,有些映射不同,发送的信号序列也不同:
$i=-1;while((++i<33)); > do > trap "echo $i >> log.txt" $i; > done -sh: trap: 32: invalid signal specification $trap trap -- 'echo 0 >> log.txt' EXIT trap -- 'echo 1 >> log.txt' HUP trap -- 'echo 2 >> log.txt' INT trap -- 'echo 3 >> log.txt' QUIT trap -- 'echo 4 >> log.txt' ILL trap -- 'echo 5 >> log.txt' TRAP trap -- 'echo 6 >> log.txt' ABRT trap -- 'echo 7 >> log.txt' EMT trap -- 'echo 8 >> log.txt' FPE trap -- 'echo 9 >> log.txt' KILL trap -- 'echo 10 >> log.txt' BUS trap -- 'echo 11 >> log.txt' SEGV trap -- 'echo 12 >> log.txt' SYS trap -- 'echo 13 >> log.txt' PIPE trap -- 'echo 14 >> log.txt' ALRM trap -- 'echo 15 >> log.txt' TERM trap -- 'echo 16 >> log.txt' URG trap -- 'echo 17 >> log.txt' STOP trap -- 'echo 19 >> log.txt' CONT trap -- 'echo 20 >> log.txt' CHLD trap -- 'echo 23 >> log.txt' IO trap -- 'echo 24 >> log.txt' Xcpu trap -- 'echo 25 >> log.txt' XFSZ trap -- 'echo 26 >> log.txt' VTALRM trap -- 'echo 27 >> log.txt' PROF trap -- 'echo 28 >> log.txt' WINCH trap -- 'echo 29 >> log.txt' INFO trap -- 'echo 30 >> log.txt' USR1 trap -- 'echo 31 >> log.txt' USR2 $
一次运行中捕获的信号是:
2 1 20 0
在第二次运行中,我得到了:
20 1 20 0
SIGINT首先令人惊讶 – 我认为我不能解释它,除非它只是意味着某种类型的不完整写入(它应该读取20但是SIGHUP导致了问题).我不确定我是否可以解释SIGCHLD信号; SIGHUP和’退出’陷阱与以前一样.
但是,在某种程度上,信号是系统特定的 – 或者看起来如此.不过,SIGHUP很常见且不变.