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