一 新建进程
在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