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

来源:互联网 发布:淘宝 clarks小公主 编辑:程序博客网 时间:2024/05/21 07:00

一 新建进程

        在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 COMMANDroot      1344  0.0  0.0   1960   276 tty2     Ss+  Jul13   0:00 /sbin/mingeroot      1346  0.0  0.0   1960   272 tty3     Ss+  Jul13   0:00 /sbin/mingeroot      1348  0.0  0.0   1960   272 tty4     Ss+  Jul13   0:00 /sbin/mingeroot      1353  0.0  0.0   1960   276 tty5     Ss+  Jul13   0:00 /sbin/mingeroot      1359  0.0  0.0   1960   276 tty6     Ss+  Jul13   0:00 /sbin/mingeroot      1387  0.4  2.2  35536 23188 tty1     Ss+  Jul13   6:07 /usr/bin/XoHyman     5769  0.0  0.0   6928   960 pts/0    Ss   Jul13   0:03 bashHyman     7028  0.0  0.1   6848  1332 pts/1    Ss   Jul13   0:01 bashroot      9226  0.0  0.2   9584  2212 pts/0    S    08:58   0:00 suroot      9235  0.0  0.1   6860  1260 pts/0    S+   08:58   0:00 bashHyman     9253  0.0  0.1   6848  1736 pts/2    Ss+  09:00   0:00 bashHyman     9675  0.1  0.0   1820   332 pts/1    S    10:55   0:00 ./a.outHyman     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 0