SIGPIPE,SIGTTIN,SIGTTOU三個信號量的解讀


SIGPIPE

TCP是全雙工的信道,可以看作兩條單工信道,TCP連接的兩個端點各負責一條。當對端調用close,雖然本意是關閉整個兩條信道,但本端只是收到FIN包。按照TCP協議的語義,表示對端只是關閉了其所負責的那一條單工信道,任然可以繼續接收數據。也就是說,因為TCP協議的限制,一個端點無法獲知對端的socket是調用了close還是shutdown。

例子:A和B使用TCP傳輸文件。現在B調用close,清空自己的接收緩存,A 往 B write(發送)數據。

如果接收緩沖已空, 則返回0, 這就是常說的表示連接關閉。但第一次對其調用write方法時,如果 A 發送數據到 B 的緩存沒問題,會返回正確寫入,但 A 發送的報文會導致B發送RST報文,因為 B 的socket已經調用了close,完全關閉,既不發送,也不接收數據。所以 A 第二次調用write方法(假設在收到 RST 報文之后),會生成 SIGPIPE 信號,導致進程退出。

為了避免進程退出,可以捕獲 SIGPIPE 信號,或者忽略它,給他設置 SIG_IGN 信號處理函數。

signal(SIGPIPE, SIG_IGN);

SIGTTIN/SIGTTOU

unix環境下,當一個進程以后台形式啟動,但嘗試去讀寫控制台終端時,將會觸發 SIGTTIN(讀) 和 SIGTTOU(寫)信號量,接着,進程將會暫停(linux默認),read/write將會返回錯誤。

這時,shell將會提醒用戶切換此進程為前台進程,以便繼續執行。后台切換至前台的命令。

fg

前台轉為后台則為 CTRL+Z 快捷鍵

那么如何才能不把進程切換至前台的情況下,讀寫控制器不會被暫停? 答案:只要忽略 SIGTTIN 和 SIGTTOU 信號量即可

signal(SIGTTIN, SIG_IGN);
signal(SIGTTOU, SIG_IGN);

SIGINT

終止進程。程序終止(interrupt)信號,通常用戶使用 Ctrl + C 發出進程終止信號

SIGKILL

終止進程     殺死進程

SIGTERM

程序結束(terminate)信號,軟件終止信號。與SIGKILL不同的是該信號可以被阻塞和處理,通常用來要求程序自己正常退出

SIGSEGV

內存訪問錯誤導致進程終止。(Segmentation fault)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM