unix網路程式設計 含訊號處理伺服器程式

2021-08-20 15:12:02 字數 1258 閱讀 5746

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...