网络编程(11)—— 进程和僵尸进程

一 新建进程

        在linux中,可以用fork函数创建一个进程的副本(windows中无该功能),fork函数的原型如下:

#include <unistd.h>
pid_t fork(void);
        若在主进程调用fork函数,将会在内存中原样拷贝主进程而形成子进程,这样子进程和主进程就会同时享有fork之后的代码,而在主进程中fork函数返回子进程的ID,而在子进程中fork返回的进程ID值为0,通过fork函数的返回值我们就可以区分子进程和主进程。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int gval=10;
int main()
{
    int ival=100;
    int pid=fork();
    if(pid==0)//子进程
    {
        ival++;
    }
    else//父进程
    {
        gval++;
    }
    if(pid==0)
    {
        printf("child process: gval=%d,ival=%d\n",gval,ival);
    }
    else
    {
        printf("parent process: gval=%d,ival=%d\n",gval,ival);
    }
    return 0;
}
         在主进程中,fork返回了子进程的进程ID,并赋值给pid,而在子进程中pid是0,然后根据pid进行判断,在子进程中ival加1,而在主进程中gval加1,然后在不同的进程中输出gval和ival的值。

二 僵尸进程

        当一个进程遇到下面两种情况会自行销毁:
        1、exit(int para)函数
        2、return para语句
        执行到上述语句时,进程会结束,但是进程的资源却不会被收回.进程结束时会将exit的参数或者return的值,交给操作系统,只有父进程主动向操作系统索取这些值后,子进程的资源才会被回收。直到父进程关闭时子进程和父进程一起关闭,在等待父进程关闭的这段时间内,子进程就成了僵尸进程。
#include<stdio.h>
#include<stdlib.h>
int main()
{
    pid_t pid=fork();
    if(pid==0)//子进程
    {
        printf("hi I'm a child process!\n");
    }
    else
    {
        printf("I'm parent process!\n"); 
        sleep(30);
    }
    if(pid==0)
        puts("End child process");
    else
        puts("End parent process");
    return 0;
}
        在上述代码中,子进程return后,返回值0会交给操作系统,而操作系统会把其交给主进程,此时主进程正在sleep 30秒,在这30秒内,子进程就成了僵尸进程。如下在这段时间用ps au查看所有进程列表:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1344  0.0  0.0   1960   276 tty2     Ss+  Jul13   0:00 /sbin/minge
root      1346  0.0  0.0   1960   272 tty3     Ss+  Jul13   0:00 /sbin/minge
root      1348  0.0  0.0   1960   272 tty4     Ss+  Jul13   0:00 /sbin/minge
root      1353  0.0  0.0   1960   276 tty5     Ss+  Jul13   0:00 /sbin/minge
root      1359  0.0  0.0   1960   276 tty6     Ss+  Jul13   0:00 /sbin/minge
root      1387  0.4  2.2  35536 23188 tty1     Ss+  Jul13   6:07 /usr/bin/Xo
Hyman     5769  0.0  0.0   6928   960 pts/0    Ss   Jul13   0:03 bash
Hyman     7028  0.0  0.1   6848  1332 pts/1    Ss   Jul13   0:01 bash
root      9226  0.0  0.2   9584  2212 pts/0    S    08:58   0:00 su
root      9235  0.0  0.1   6860  1260 pts/0    S+   08:58   0:00 bash
Hyman     9253  0.0  0.1   6848  1736 pts/2    Ss+  09:00   0:00 bash
Hyman     9675  0.1  0.0   1820   332 pts/1    S    10:55   0:00 ./a.out
Hyman     9676  0.0  0.0      0     0 pts/1    Z    10:55   0:00  
Hyman     9677  0.0  0.0   6384  1000 pts/1    R+   10:55   0:00 p

        请注意PID=9676的进程,其状态STAT为Z的就是我们的子进程,现在就成了僵尸进程,直到我们的主进程结束后其资源才会被释放.


Github位置:

https://github.com/HymanLiuTS/NetDevelopment

克隆本项目:

git clone git@github.com:HymanLiuTS/NetDevelopment.git

获取本文源代码:

git checkout NL11

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值