- 服務器務必要對應多個客戶端, 但是accept是一個阻塞函數(shù), 所以根據(jù)需求, 主進程可以負責accept, 然后子進程對接受請求的文件描述符進行通信, 而不會影響主進程的accept.
- 注意: 1. 創(chuàng)建完子進程之后, 共享文件描述符, 但是子進程對監(jiān)聽的文件描述符不需要, 所以關閉監(jiān)聽文件描述符. 2. 子進程資源的回收: 因為父進程在負責accept, 無法顧及子進程資源的回收, 這是一般通過信號來解決, 即在fork之前, 或者父進程里注冊信號捕捉.但是在處理函數(shù)中使用的wait要使用循環(huán)來wait, 因為如果有多個進程同時需要回收, 但是信號是不支持排隊, 所以需要循環(huán)回收
void func(int no) {
while(waitpid() > 0)
}
tcp多進程偽代碼: 回頭更新完整代碼
int main {
// 創(chuàng)建監(jiān)聽的套接字
int lfd = socket()
// 綁定
bind(lfd, &sockaddr_in, len); // 監(jiān)聽
listen(lfd, 128);
// 注冊信號捕捉
struct sigaction act; sigaction(SIGCHLD, &act, NULL);
while(1) {
// 阻塞等待連接請求 int cfd = accept();
// 創(chuàng)建子進程
pid_t pid = fork();
// 子進程 if(pid == 0) {
close(lfd);
// 通信 - 客戶端
while(1)
{
// 接收數(shù)據(jù) recv(cfd);
// 發(fā)送數(shù)據(jù) send(cfd);
} }
} }
void func(int no) {
while(waitpid() > 0)
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。