code_tin

从头编写高性能服务程序6-多进程阻塞完整版
前面所有的程序都是缺少链接的后期管理的 我们在多进程的情况下测试子进程处理完后自行退出 而主进程继续监听的情况 一...
扫描右侧二维码阅读全文
29
2010/01

从头编写高性能服务程序6-多进程阻塞完整版

前面所有的程序都是缺少链接的后期管理的
我们在多进程的情况下测试子进程处理完后自行退出
而主进程继续监听的情况
一开始我认为只要子进程处理完之后exit就可以了
结果碰到了问题
子进程在主进程未退出的情况下先行退出
会变成僵尸进程
反之则会变成孤儿进程

僵尸进程的表现是子进程在ps下后面多个defunct
解决方法是在主进程这里需要wait
用来处理子进程的各种状态

还有我们加上了客户端退出时候的处理
当客户端退出时
我们recv到的数据返回值会是0
而之前会被阻塞在那边
所以加上对recv的返回值0的处理就可以了

#include #include #include #include #include int main(){ int listen_fd,accept_fd,flag; struct sockaddr_in my_addr,remote_addr; if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ perror("create socket error"); exit(1); } if (setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR ,(char *)&flag,sizeof(flag)) == -1){ perror("setsockopt error"); } my_addr.sin_family = AF_INET; my_addr.sin_port = htons(3389); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero), 8); if (bind(listen_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr_in)) == -1) { perror("bind error"); exit(1); } if (listen(listen_fd,1) == -1){ perror("listen error"); exit(1); } int pid=-1; int addr_len = sizeof(struct sockaddr_in); int max_process_num = 10; int i; int child_process_status; for(i = 0; i< max_process_num; i++){ if(pid != 0){ pid = fork(); } } if(pid == 0){ for(;;){ accept_fd = accept(listen_fd ,(struct sockaddr *)&remote_addr,&addr_len); int recv_num; for(;;){ char in_buf[1024]; memset(in_buf, 0, 1024); recv_num = recv(accept_fd ,&in_buf ,1024 ,0); if(recv_num == 0){ printf("close socket\n"); close(accept_fd); break; } else{ printf("accept:%d:%s\n", recv_num, in_buf); } } } } else{ //manager the process wait(&child_process_status); } return 0; }

Last modification:November 26th, 2018 at 04:16 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment