日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > Socket編程實踐(8) --TCP服務器常見問題(3)

Socket編程實踐(8) --TCP服務器常見問題(3)

來源:程序員人生   發布時間:2014-12-19 08:38:08 閱讀次數:2520次

服務端多進程避免僵尸進程的方法

1)通過疏忽SIGCHLD信號,解決僵尸進程

    在server端代碼中添加

signal(SIGCHLD, SIG_IGN);

2)通過wait/waitpid方法,解決僵尸進程

  signal(SIGCHLD,onSignalCatch);      void onSignalCatch(int signalNumber)   {    wait(NULL);   }

Server端部份代碼:

//return a socket that have start listened. int mkATCPServer(int serverPort, int backlog = SOMAXCONN) { int sockfd = socket(AF_INET,SOCK_STREAM,0); if (sockfd == ⑴) { err_exit("socket error"); } //add address reused int on = 1; if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)) == ⑴) { err_exit("setsockopt SO_REUSEADDR error"); } //band a local address and port struct sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(serverPort); serverAddr.sin_addr.s_addr = INADDR_ANY; //band an any IP address if (bind(sockfd,(struct sockaddr *)&serverAddr,sizeof(serverAddr)) == ⑴) { err_exit("bind error"); } //start to listen. if (listen(sockfd,backlog) == ⑴) { err_exit("listen error"); } return sockfd; } void onSignalCatch(int signalNumber) { waitpid(⑴,NULL,WNOHANG); } int main() {   //安裝SIGCHLD信號處理函數 signal(SIGCHLD,onSignalCatch); int serverSockfd = mkATCPServer(8002); struct sockaddr_in peerAddr; socklen_t peerLen = sizeof(peerAddr); while (true) { //接受鏈接 int peerSockfd = accept(serverSockfd, (struct sockaddr *)&peerAddr,&peerLen); if (peerSockfd == ⑴) { err_exit("accept error"); } ..... //其他部份代碼與前面類似

多客戶端同時關閉問題

問題描寫以下:



客戶端代碼實現代碼

//其他代碼如前 //.... int main() { int serverSocket[10]; int socketCount = 10; for (int i = 0; i < socketCount; ++i) { serverSocket[i] = mkATCPClient(8002,"127.0.0.1"); } sleep(100); return 0; }

 在客戶運行進程中按下Ctrl+C,則可以看到在server端啟動10個子進程,并且所有的客戶端全部1起斷開的情況下,產生的僵尸進程數是驚人的(此時也證明了SIGCHLD信號是不可靠的)!

 

 

解決方法:

//server端部份代碼以下: //其他如前.... void onSignalCatch(int signalNumber) {   int ret = 0;   //注意此處!!!! while ((ret = waitpid(⑴,NULL,WNOHANG) != ⑴)) ; } int main() { signal(SIGCHLD,onSignalCatch); int serverSockfd = mkATCPServer(8002);   ...

從下圖可以看出,出了監聽server進程,已沒有僵尸進程了!



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲精品久久久蜜桃 | 国产理论一区二区三区 | 精品国产一区二区三区免费 | 国产精品日韩欧美一区二区三区 | 麻豆av在线播放 | 成人精品 | 天天看天天操 | 久久国内免费视频 | 久久久久久国产免费 | 欧美日韩精品一区二区三区 | 久日av| 国产欧美日韩一区 | 欧美日在线观看 | 免费a级毛片视频 | 中文字幕 欧美 日韩 | 在线免费av观看 | 夜夜视频 | 久久久国产精品一区二区三区 | 日韩伦理电影网 | 日韩人成 | 亚洲精品乱码久久久久久蜜桃图片 | 成人在线国产 | 国产美女一区二区 | 欧美日韩激情 | 欧美一区二区久久 | 精品中文字幕一区 | 91麻豆精品国产91久久久资源速度 | 看亚洲a级一级毛片 | 99精品国产九九国产精品 | 成人免费在线电影 | 一区二区三区在线视频免费观看 | 曰韩在线 | 麻豆久久 | 欧美日韩一区二区三区不卡 | h片在线免费观看 | 日本性网站 | 日韩欧美在线视频 | 一区二区三区高清在线观看 | 久久国产精品视频免费看 | 亚洲国产精品99久久久久久久久 | 日韩国产精品一区二区 |