信號(hào)發(fā)送到一個(gè)程序來(lái)表示,一個(gè)重要的事件已經(jīng)發(fā)生軟件中斷。事件可以從用戶請(qǐng)求訪問(wèn)非法內(nèi)存錯(cuò)誤。一些信號(hào),例如中斷信號(hào),表明用戶提出的程序來(lái)完成的東西,而不是在通常的控制流。
以下是一些你可能會(huì)遇到的,要在程序中使用的更常見(jiàn)的信號(hào):
| 信號(hào)名稱 | 信號(hào)數(shù) | 描述 |
|---|---|---|
| SIGHUP | 1 | Hang up detected on controlling terminal or death of controlling process |
| SIGINT | 2 | Issued if the user sends an interrupt signal (Ctrl + C). |
| SIGQUIT | 3 | Issued if the user sends a quit signal (Ctrl + D). |
| SIGFPE | 8 | Issued if an illegal mathematical operation is attempted |
| SIGKILL | 9 | If a process gets this signal it must quit immediately and will not perform any clean-up operations |
| SIGALRM | 14 | Alarm Clock signal (used for timers) |
| SIGTERM | 15 | Software termination signal (sent by kill by default). |
有一個(gè)簡(jiǎn)單的方法,列出了所有你的系統(tǒng)支持的信號(hào)。只要發(fā)出 kill -l 命令,它會(huì)顯示所有支持的信號(hào):
$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
實(shí)際的信號(hào)列表之間的Solaris,HP-UX 和 Linux。
每個(gè)信號(hào)都有默認(rèn)與它相關(guān)聯(lián)的動(dòng)作。信號(hào)的默認(rèn)操作是,當(dāng)它接收信號(hào)的動(dòng)作腳本或程序執(zhí)行。
有些可能違反的操作是:
終止進(jìn)程。
忽略信號(hào)。
核心轉(zhuǎn)儲(chǔ)。這將創(chuàng)建一個(gè)文件稱為核心記憶形象的過(guò)程,當(dāng)它收到的信號(hào)。
停止進(jìn)程。
繼續(xù)停止的進(jìn)程。
有幾種方法提供一個(gè)程序或腳本的信號(hào)。其中最常見(jiàn)的是執(zhí)行腳本時(shí)用戶鍵入Control-C或INTERRUPT 鍵。
當(dāng)你按下Ctrl+ C鍵發(fā)送一個(gè)SIGINT的腳本,并按照定義的默認(rèn)動(dòng)作腳本終止。
其他常見(jiàn)的傳送信號(hào)的方法是使用kill命令的語(yǔ)法如下:
$ kill -signal pid
signal 信號(hào)提供的電話號(hào)碼或姓名,pid是信號(hào)要發(fā)送到的進(jìn)程ID。示例:
$ kill -1 1001
HUB或掛起信號(hào)發(fā)送到正在運(yùn)行的程序的進(jìn)程ID 1001。發(fā)送kill信號(hào)相同的過(guò)程使用以下命令:
$ kill -9 1001
這會(huì)殺死正在運(yùn)行的進(jìn)程的進(jìn)程ID 1001。
當(dāng)你按下Ctrl + C鍵或Break鍵在終端一個(gè)shell程序的執(zhí)行過(guò)程中,正常程序?qū)⒘⒓唇K止,并返回命令提示符。這可能并不總是可取的。例如,你可能最終留下了一堆臨時(shí)文件,將不會(huì)清理。
捕獲這些信號(hào)是很容易的,trap命令的語(yǔ)法如下:
$ trap commands signals
這里的命令可以是任何有效的Unix命令,或什至一個(gè)用戶定義的函數(shù),信號(hào)可以是任意數(shù)量的信號(hào),你想來(lái)捕獲的列表。
在shell腳本中的陷阱有三種常見(jiàn)的用途:
清理臨時(shí)文件
忽略信號(hào)
trap命令作為一個(gè)例子,下面展示了如何可以刪除一些文件,然后退出,如果有人試圖從終端中止程序:
$ trap "rm -f $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 2
執(zhí)行shell程序,這個(gè)陷阱的角度,這兩個(gè)文件work1$$ 和 dataout$$ 將被自動(dòng)刪除,如果程序接收信號(hào)數(shù)為2。
因此,用戶中斷執(zhí)行,如果執(zhí)行的程序后,這個(gè)陷阱你可以放心,這兩個(gè)文件將被清理。 exit 命令如下 rm 是必要的,因?yàn)闆](méi)有它的執(zhí)行將繼續(xù)在節(jié)目中的一點(diǎn),它離開(kāi)時(shí)收到信號(hào)。
1號(hào)信號(hào)產(chǎn)生掛斷:要么有人故意掛斷線路或線路被意外斷開(kāi)。
您可以修改前面的陷阱也刪除指定的文件,在這種情況下,兩個(gè)信號(hào)信號(hào)1號(hào)添加到列表:
$ trap "rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 1 2
現(xiàn)在,這些文件將被刪除,如果該行被掛了,或者按Ctrl+ C鍵被按下。
來(lái)捕獲指定的命令必須用引號(hào)括起來(lái),如果它們包含一個(gè)以上的命令。另外請(qǐng)注意,在 shell 命令行掃描 trap 命令得到執(zhí)行,并再次當(dāng)一個(gè)所列出的的信號(hào)被接收的時(shí)間。
WORKDIR 值 $$ 所以在前面的例子中,將被取代 trap 命令執(zhí)行的時(shí)間。如果你想這種替代發(fā)生在收到信號(hào)1或2的時(shí)間你可以把單引號(hào)內(nèi)的命令:
$ trap 'rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit' 1 2
如果陷阱列出的命令是空的,指定的信號(hào)接收時(shí),將被忽略。例如,下面的命令:
$ trap '' 2
指定的中斷信號(hào)是被忽略的。你可能要忽略某些信號(hào)時(shí)進(jìn)行一些操作,不希望打斷。可以指定多個(gè)信號(hào)被忽略如下:
$ trap上一篇:UNIX 目錄管理