linux之trap命令
一. trap捕捉到信號之后,可以有三種反應方式:?
(1)執行一段程序來處理這一信號?
(2)接受信號的默認操作?
(3)忽視這一信號?
二. trap對上面三種方式提供了三種基本形式:?
?注意:?
(1) 對信號11(段違例)不能捕捉,因為shell本身需要捕捉該信號去進行內存的轉儲。?
(2) 在trap中可以定義對信號0的處理(實際上沒有這個信號), shell程序在其終止(如執行exit語句)時發出該信號。?
(3) 在捕捉到signal-list中指定的信號并執行完相應的命令之后, 如果這些命令沒有將shell程序終止的話,shell程序將繼續執行收到信號時所執行的命令后面的命令,這樣將很容易導致shell程序無法終止。?
另外,在trap語句中,單引號和雙引號是不同的,當shell程序第一次碰到trap語句時,將把commands中的命令掃描一遍。此時若commands是用單引號括起來的話,那么shell不會對commands中的變量和命令進行替換, 否則commands中的變量和命令將用當時具體的值來替換。?
在有些情況下,我們不希望自己的shell腳本在運行時刻被中斷,比如說我們寫得shell腳本設為某一用戶的默認shell,使這一用戶進入系統后只能作某一項工作,如數據庫備份, 我們可不希望用戶使用ctrl+C之類便進入到shell狀態,做我們不希望做的事情。這便用到了信號處理。?
kill -l可以列出系統的信號名稱,如下:?
通常我們需要忽略的信號有四個,即:HUP, INT, QUIT, TSTP,也就是信號1, 2, 3, 24使用這樣的語句可以使這些中斷信號被忽略:?
trap "" 1 2 3 24 或 trap "" HUP INT QUIT TSTP?
用 trap :1 2 3 24 或 trap HUP INT QUIT TSTP使其回復默認值。?
用stty -a可以列出中斷信號與鍵盤的對應,分別執行上面的命令后,運行?
tail -f /etc/passwd, 然后嘗試用鍵盤中斷,試試兩種情況(默認和忽略)下有何不同。?
附:?
Linux信號簡介 ?
1) SIGHUP 本信號在用戶終端連接(正常或非正常)結束時發出, 通常是在終端的控制進程結束時, 通知同一session內的各個作業, 這時它們與控制終端不再關聯. ?
2) SIGINT 程序終止(interrupt)信號, 在用戶鍵入INTR字符(通常是Ctrl-C)時發出 ?
3) SIGQUIT 和SIGINT類似, 但由QUIT字符(通常是Ctrl-\)來控制. 進程在因收到SIGQUIT退出時會產生core文件, 在這個意義上類似于一個程序錯誤信號. ?
4) SIGILL 執行了非法指令. 通常是因為可執行文件本身出現錯誤, 或者試圖執行數據段. 堆棧溢出時也有可能產生這個信號. ?
5) SIGTRAP 由斷點指令或其它trap指令產生. 由debugger使用. ?
6) SIGABRT 程序自己發現錯誤并調用abort時產生. ?
7) SIGIOT 在PDP-11上由iot指令產生, 在其它機器上和SIGABRT一樣. ?
8) SIGBUS 非法地址, 包括內存地址對齊(alignment)出錯. eg: 訪問一個四個字長的整數, 但其地址不是4的倍數. ?
9) SIGFPE 在發生致命的算術運算錯誤時發出. 不僅包括浮點運算錯誤, 還包括溢出及除數為0等其它所有的算術的錯誤. ?
10) SIGKILL 用來立即結束程序的運行. 本信號不能被阻塞, 處理和忽略.? ?
11) SIGUSR1 留給用戶使用 ?
12) SIGSEGV 試圖訪問未分配給自己的內存, 或試圖往沒有寫權限的內存地址寫數據. ?
13) SIGUSR2 留給用戶使用 ?
14) SIGPIPE Broken pipe ?
15) SIGALRM 時鐘定時信號, 計算的是實際的時間或時鐘時間. alarm函數使用該信號. ?
16) SIGTERM 程序結束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理. 通常用來要求程序自己正常退出. shell命令kill缺省產生這個信號.? ?
17) SIGCHLD 子進程結束時, 父進程會收到這個信號. ?
18) SIGCONT 讓一個停止(stopped)的進程繼續執行. 本信號不能被阻塞. 可以用一個handler來讓程序在由stopped狀態變為繼續執行時完成特定的工作. 例如, 重新顯示提示符 ?
19) SIGSTOP 停止(stopped)進程的執行. 注意它和terminate以及interrupt的區別: 該進程還未結束, 只是暫停執行. 本信號不能被阻塞, 處理或忽略. ?
20) SIGTSTP 停止進程的運行, 但該信號可以被處理和忽略. 用戶鍵入SUSP字符時(通常是Ctrl-Z)發出這個信號 ?
21) SIGTTIN 當后臺作業要從用戶終端讀數據時, 該作業中的所有進程會收到SIGTTIN信號. 缺省時這些進程會停止執行. ?
22) SIGTTOU 類似于SIGTTIN, 但在寫終端(或修改終端模式)時收到. ?
23) SIGURG 有緊急數據或out-of-band數據到達socket時產生. ?
24) SIGXCPU 超過CPU時間資源限制. 這個限制可以由getrlimit/setrlimit來讀取/改變 ?
25) SIGXFSZ 超過文件大小資源限制. ?
26) SIGVTALRM 虛擬時鐘信號. 類似于SIGALRM, 但是計算的是該進程占用的CPU時間.?
27) SIGPROF 類似于SIGALRM/SIGVTALRM, 但包括該進程用的CPU時間以及系統調用的時間. ?
28) SIGWINCH 窗口大小改變時發出. ?
29) SIGIO 文件描述符準備就緒, 可以開始進行輸入/輸出操作. ?
30) SIGPWR Power failure
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的linux之trap命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 函数返回值失效
- 下一篇: python 反射机制