【study】socket结合僵尸进程的处理
按照前两天总结的处理僵尸进程的方法,我们把这些方法应用在socket编程中。socket中,难免会多个client连接server,当client同步退出后,server如何处理子进程呢?(暂时不考虑粘包问题哈,只是简单的读写哦)
client代码如下:我们创建5个client,同时连接server
server代码如下:
gcc编译后 运行 ./client ,./server
ps - u 查看下当前进程
ps- u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
liu+ 56868 0.0 0.0 23156 4488 pts/3 Ss 14:01 0:00 -bash
liu+ 80608 0.0 0.0 23148 4476 pts/7 Ss 15:32 0:00 -bash
liu+ 80649 0.0 0.0 23016 4208 pts/8 Ss 15:32 0:00 -bash
liu+ 82028 0.0 0.0 4192 356 pts/7 S+ 16:07 0:00 ./service
liu+ 82029 0.0 0.0 4192 352 pts/3 S+ 16:07 0:00 ./client
liu+ 82030 0.0 0.0 4192 92 pts/7 S+ 16:07 0:00 ./service
liu+ 82031 0.0 0.0 4192 92 pts/7 S+ 16:07 0:00 ./service
liu+ 82032 0.0 0.0 4192 92 pts/7 S+ 16:07 0:00 ./service
liu+ 82033 0.0 0.0 4192 92 pts/7 S+ 16:07 0:00 ./service
liu+ 82034 0.0 0.0 4192 92 pts/7 S+ 16:07 0:00 ./service
liu+ 82038 0.0 0.0 18444 1332 pts/8 R+ 16:07 0:00 ps -u|
netstat | grep 8001 //查看下tcp/ip当前状态
tcp 0 0 localhost:8001 localhost:47514 ESTABLISHED
tcp 0 0 localhost:8001 localhost:47515 ESTABLISHED
tcp 0 0 localhost:47514 localhost:8001 ESTABLISHED
tcp 0 0 localhost:47515 localhost:8001 ESTABLISHED
tcp 0 0 localhost:47513 localhost:8001 ESTABLISHED
tcp 0 0 localhost:8001 localhost:47516 ESTABLISHED
tcp 0 0 localhost:8001 localhost:47513 ESTABLISHED
tcp 0 0 localhost:47516 localhost:8001 ESTABLISHED
tcp 0 0 localhost:8001 localhost:47512 ESTABLISHED
tcp 0 0 localhost:47512 localhost:8001 ESTABLISHED
说明已经建立连接。此时我们杀掉client进程,5个链接会同时推出,ps-u 查看下当前进程状态
ps -u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
liuchun+ 56868 0.0 0.0 23156 4488 pts/3 Ss+ 14:01 0:00 -bash
liuchun+ 80608 0.0 0.0 23148 4476 pts/7 Ss 15:32 0:00 -bash
liuchun+ 80649 0.0 0.0 23016 4208 pts/8 Ss 15:32 0:00 -bash
liuchun+ 82028 0.0 0.0 4192 356 pts/7 S+ 16:07 0:00 ./service
liuchun+ 82030 0.0 0.0 0 0 pts/7 Z+ 16:07 0:00 [service] <defunct>
liuchun+ 82031 0.0 0.0 0 0 pts/7 Z+ 16:07 0:00 [service] <defunct>
liuchun+ 82032 0.0 0.0 0 0 pts/7 Z+ 16:07 0:00 [service] <defunct>
liuchun+ 82033 0.0 0.0 0 0 pts/7 Z+ 16:07 0:00 [service] <defunct>
liuchun+ 82034 0.0 0.0 0 0 pts/7 Z+ 16:07 0:00 [service] <defunct>
liuchun+ 82039 0.0 0.0 18444 1328 pts/8 R+ 16:07 0:00 ps -u
由于server端没有处理子进程,导致出现5个僵尸进程,
netstat | grep 8001
tcp 0 0 localhost:47514 localhost:8001 TIME_WAIT
tcp 0 0 localhost:47515 localhost:8001 TIME_WAIT
tcp 0 0 localhost:47513 localhost:8001 TIME_WAIT
tcp 0 0 localhost:47516 localhost:8001 TIME_WAIT
tcp 0 0 localhost:47512 localhost:8001 TIME_WAIT
同时也会进入经典的半链接状态。
此时按照上次博客所说,处理僵尸进程
1、忽略信号
main 开始加此句话
signal(SIGCHLD,SIG_IGN);
运行结果如下:
ps -u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
liuchun+ 56868 0.0 0.0 23156 4492 pts/3 Ss 14:01 0:00 -bash
liuchun+ 80608 0.0 0.0 23148 4476 pts/7 Ss+ 15:32 0:00 -bash
liuchun+ 80649 0.0 0.0 23016 4212 pts/8 Ss 15:32 0:00 -bash
liuchun+ 133587 0.0 0.0 4192 352 pts/3 S+ 16:50 0:00 ./service
liuchun+ 133598 0.0 0.0 18444 1328 pts/8 R+ 16:50 0:00 ps -u
子进程正常退出
2、调用wait
此时
void handler(int num)
{
wait(NULL);
}
signal(SIGCHLD,handler);
liuchun+ 56868 0.0 0.0 23156 4492 pts/3 Ss+ 14:01 0:00 -bash
liuchun+ 80608 0.0 0.0 23156 4484 pts/7 Ss 15:32 0:00 -bash
liuchun+ 80649 0.0 0.0 23016 4212 pts/8 Ss 15:32 0:00 -bash
liuchun+ 133633 0.0 0.0 4192 504 pts/7 S+ 16:54 0:00 ./service
liuchun+ 133637 0.0 0.0 0 0 pts/7 Z+ 16:54 0:00 [service] <defunct>
liuchun+ 133638 0.0 0.0 0 0 pts/7 Z+ 16:54 0:00 [service] <defunct>
liuchun+ 133639 0.0 0.0 0 0 pts/7 Z+ 16:54 0:00 [service] <defunct>
liuchun+ 133643 0.0 0.0 18444 1328 pts/8 R+ 16:54 0:00 ps -u
还是有2个僵尸进程,wait 只回收一个子进程,且是不可靠信号啊
3.waitpid回收
void handler(int num)
{
int pp_pid = 0;
while((pp_pid = waitpid(-1,NULL,WNOHANG)) > 0)
{
printf("break pid :%d \n",pp_pid);
}
}
ps -u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
liuchun+ 39592 0.0 0.0 4192 504 pts/3 S+ 17:26 0:00 ./service
liuchun+ 39602 0.0 0.0 18444 1316 pts/8 R+ 17:27 0:00 ps -u
liuchun+ 56868 0.0 0.0 23188 4524 pts/3 Ss 14:01 0:00 -bash
liuchun+ 80608 0.0 0.0 23156 4484 pts/7 Ss+ 15:32 0:00 -bash
liuchun+ 80649 0.0 0.0 23016 4212 pts/8 Ss 15:32 0:00 -bash
不会再出现僵尸进程。