1. linux內部用乙個128個位元組(多個unsigned long)的結構(sigset_t)表示訊號的掩碼,在i386平台上就是128/4=32個long,每位對應乙個訊號的掩碼,最大支援128*8 = 1024
個訊號。現在只有64個訊號,所以只要考慮最前面的兩個long就可以了。
sigset_t mask;
unsigned long *pl = (unsigned long*)&mask;
pl[0]和pl[1]就表示當前64個訊號的掩碼,如果對應訊號的那位=1,表示訊號被遮蔽,發訊號不會到達那個程序(執行緒)。=0,則相反。可以用sigfillset,sigaddset,sigemptyset等函式設定,這些函式定義在glibc的signal目錄中.. 注意:9(sigkill), 19(sigstop),
32(不支援),33(不支援)這幾個訊號是不能遮蔽的。
2. linux執行緒的特性:無論在哪個執行緒中定義訊號處理函式都是一樣的,同乙個訊號處理函式只能有乙個,如果定義了多個,就會覆蓋前乙個。如果建立子執行緒以前設定了掩碼,那麼子執行緒中自動繼承這個掩碼。可以在子執行緒中重新設定掩碼。這樣可以實現把特定訊號分派給指定執行緒處理的功能。
3. 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) sigbus
非法位址, 包括記憶體位址對齊(alignment)出錯。比如訪問乙個四個字長的整數, 但其位址不是4的倍數。它與sigsegv的區別在於後者是由於對合法儲存位址的非法訪問觸發的(如訪問不屬於自己儲存空間或唯讀儲存空間)。
8) sigfpe
在發生致命的算術運算錯誤時發出. 不僅包括浮點運算錯誤, 還包括溢位及除數為0等其它所有的算術的錯誤。
9) sigkill
用來立即結束程式的執行. 本訊號不能被阻塞、處理和忽略。如果管理員發現某個程序終止不了,可嘗試傳送這個訊號。
10) sigusr1
留給使用者使用
11) sigsegv
試圖訪問未分配給自己的記憶體, 或試圖往沒有寫許可權的記憶體位址寫資料.
12) sigusr2
留給使用者使用
13) sigpipe
管道破裂。這個訊號通常在程序間通訊產生,比如採用fifo(管道)通訊的兩個程序,讀管道沒開啟或者意外終止就往管道寫,寫程序會收到sigpipe訊號。此外用socket通訊的兩個程序,寫程序在寫socket的時候,讀程序已經終止。
14) sigalrm
時鐘定時訊號, 計算的是實際的時間或時鐘時間. alarm函式使用該訊號.
15) sigterm
程式結束(terminate)訊號, 與sigkill不同的是該訊號可以被阻塞和處理。通常用來要求程式自己正常退出,shell命令kill預設產生這個訊號。如果程序終止不了,我們才會嘗試sigkill。
17) sigchld
子程序結束時, 父程序會收到這個訊號。
如 果父程序沒有處理這個訊號,也沒有等待(wait)子程序,子程序雖然終止,但是還會在核心程序表中占有表項,這時的子程序稱為殭屍程序。這種情況我們應 該避免(父程序或者忽略sigchild訊號,或者捕捉它,或者wait它派生的子程序,或者父程序先終止,這時子程序的終止自動由init程序來接 管)。
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
31) sigsys
非法的系統呼叫。
在以上列出的訊號中,程式不可捕獲、阻塞或忽略的訊號有:sigkill,sigstop
不能恢復至預設動作的訊號有:sigill,sigtrap
缺省會導致程序流產的訊號有:sigabrt,sigbus,sigfpe,sigill,sigiot,sigquit,sigsegv,sigtrap,sigxcpu,sigxfsz
缺省會導致程序退出的訊號有:sigalrm,sighup,sigint,sigkill,sigpipe,sigpoll,sigprof,sigsys,sigterm,sigusr1,sigusr2,sigvtalrm
缺省會導致程序停止的訊號有:sigstop,sigtstp,sigttin,sigttou
預設程序忽略的訊號有:sigchld,sigpwr,sigurg,sigwinch
此外,sigio在svr4是退出,在4.3bsd中是忽略;sigcont在程序掛起時是繼續,否則是忽略,不能被阻塞。
trackback:
程序訊號掩碼處理
int sigprocmask int how,const sigset t restrict set,sigset t restrict oldset 乙個程序的訊號遮蔽字規定了當前阻塞而不能遞送給該程序的訊號集。sigprocmask 可以用來檢測或改變目前的訊號遮蔽字,其操作依引數how來決定...
Linux預設許可權掩碼
linux教程 linux教程 當我們建立檔案或目錄時,系統會自動根據許可權掩碼來生成預設許可權 預設情況下的umask值是022 可以用umask命令檢視 此時你建立的檔案預設許可權是644 6 0,6 2,6 2 建立的目錄的預設許可權是755 7 0,7 2,7 2 umask可用來設定許可權...
linux訊號 阻塞訊號
1.訊號在核心中的表示 我們知道了訊號產生的各種原因,而實際執行訊號處理的動作,叫做訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達的動作。注意,阻...