【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

不会再出现僵尸进程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值