sigpipe訊號
當子程序結束時,會給父程序傳送乙個sigchid訊號,而我們之前的伺服器程式預設是不處理的。此時子程序就會是半死不死的僵死程式,會占用系統程序資源。因此我們需要建立乙個訊號處理程式,每當發生這個sigchid訊號時,都對其進行處理,消滅它。
系統自帶的有wait和waitpid程式可以處理上述問題,但是兩者有區別。前者可能不能處理多子程序同時結束的情況
訊號處理函式返回時,如果是慢系統可能會返回乙個eint錯誤,如何對其進行處理。
posix規定:
1. 訊號處理函式安裝(存在並且呼叫)一次,就一直安裝著。(類似中斷處理),因此在子程序建立之前建立就可以了。
2. 訊號處理函式執行時,正在遞交的訊號全部被阻塞,同時可以阻塞其他訊號(sigaction
函式中的sa_mask
,空集則表示不阻塞其他訊號。)
wait函式比較簡單,是後者的特殊情況。
程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序,wait就會收集這個子程序的資訊,並把它徹底銷毀後返回;如果沒有找到這樣乙個子程序,wait就會一直阻塞在這裡,直到有乙個出現為止。
因此,如果放在while迴圈裡面,那麼一旦存在正在執行的子程序就會一直阻塞,導致無法退出訊號處理函式。
後者可以指定選項引數,要求不阻塞就可以。
#include "unp.h"
intmain(int argc, char **argv)
if ( (childpid = fork()) == 0)
close(connfd); /* parent closes connected socket */
}}
1.當乙個程序想某個已經收到rst的套接字執行寫操作時,核心會向程序傳送乙個sigpipe訊號。
如果不處理,則客戶端程序難以知道是由於連線已經斷開,而是認識是異常終止。與實際不符合。
將寫操作分兩步,第一步引發rst,然後再寫剩餘的東西,可以收到乙個sigpipe訊號。
如果不想終止程序可以忽略。
struct sigaction act;
act.sa_handler = sig_ign;
if (sigaction(sigpipe, &act, null) == 0)
UNIX網路程式設計
在unix network programming 的 3.7 inet pton and inet ntop functions 中提到中有如下兩個巨集定義 define inet addrstrlen 16 for ipv4 dotted decimal define inet6 addrstr...
unix網路程式設計
任何tcp的實現都需要為msl選擇乙個合適的值,rfc的建議值是2分鐘。分組可能出現迷途,若迷途分組在msl中找到路,造成重複,tcp必須修復 time wait存在的理由 可靠的實現全雙工的連線和終止 考慮最終ack丟失的情況,允許老的重複分組在網路中消逝 tcp的化生身現象,因為time wai...
unix環境高階程式設計 訊號(2)
函式kill和raise kill函式將訊號傳送給程序或程序組,raise函式則執行程序向自身傳送訊號。kill的pid引數有以下四種不同情況 pid 0,將該訊號傳送給程序id為pid的程序 pid 0,將該訊號傳送給與傳送程序屬於同一程序組的所有程序。pid 0 將該訊號傳送給程序組id等於pi...