Linux網路程式設計多程序模型

2021-08-08 04:34:30 字數 1518 閱讀 4643

#include #include #include #include #include #include #include #define serv_port 8080

#define maxline 100

#define maxsize 4096

void sys_error(const char *fun_str,int exitno)

void sig_handle(int signo)

return;

}//使用多程序版本中容易忽視的問題 ,我們只是負責建立了子程序去處理去客戶端的互動 ,卻沒有考慮到子程序結束時 ,父程序並沒有**子程序的資源

//子程序在結束時會傳送sigchld訊號 因此我們可以在訊號處理函式中 去**子程序的資源(pcb等)

int main(void)

bzero(&serv_addr,sizeof(serv_addr));

serv_addr.sin_family = af_inet;

serv_addr.sin_port = htons(serv_port);

serv_addr.sin_addr.s_addr = htonl(inaddr_any);

ret = bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));

if(-1 == ret)

//listen 中backlog的值為兩個連線佇列的和 已完成連線佇列 和正處於三次握手的待連線佇列

ret = listen(sockfd,20);

if(-1 == ret)

printf("waiting for connnect\n");

//sigchld的訊號處理函式用於**子程序的資源

signal(sigchld,sig_handle);

while(1)

sys_error("accept",-4);

} printf("recived from ip %s port %d\n",

inet_ntop(af_inet,&cli_addr.sin_addr.s_addr,buf,sizeof(buf)),ntohs(cli_addr.sin_port));

/*accept阻塞於等待客戶端的連線 如果此時服務端需要讀取資料又會阻塞 這時服務端便不能與新的客戶端進行連線 如果將read設定為非阻塞模式,也只是以輪詢的模式與

新的客戶端進行連線 如果服務端有資料需要讀取 這時新的連線又會失敗

這時採取多程序的方式處理 父程序等待客戶端的連線 而子程序負責處理與客戶端具體的互動

*/pid = fork();

if(0==pid)

ret = write(connfd, info, n);

if(ret<0)

}ret = close(connfd);

if(-1 == ret)

}else if(pid >0)

else

}return 0;

}

Linux網路程式設計之多程序

多程序模型 多程序模型下,注意如何在程序之間通訊以及孤兒程序和殭屍程序的處理,可以外配上程序池作為計算任務 非同步任務的處理。fork server include include include include include include include include include voi...

linux多程序程式設計

在linux中,執行的乙個程序,會占去linux的三個地方,區,堆疊區和資料區.如果同時執行多個相同的程式,他們就會使用相同的 區,區中存放的就程式的 但是資料區和堆疊區分別存放的是程式的資料,全域性變數和區域性變數,因此即使是相同的程式,也不可同時使用相同的資料和堆疊區.include inclu...

網路程式設計3 多程序 多執行緒程式設計 IO模型

select系統呼叫第乙個引數需要 1先說明一下,在windows中,並不要求select函式的第乙個引數總應該是fdmax 1 在windows下,給定 1就行 那linux中為什麼又是呢?這就涉及到linux select第乙個引數的函式 待測試的描述集的總個數。但要注意,待測試的描述集總是從0...