创建子进程
我们可以通过调用fork创建一个新的进程,这个系统调用复制当前的进程,在进程表中创建一个新的表项,新表项中的许多属性与当前进程是相同的。新进程几乎与原进程一摸一样,执行代码也完全一样,但新进程右自己的数据空间、环境和文件描述符。fork和exec函数结合在一起使用就是创建新进程所需要的一切了。
1、fork函数创建如下
2、fork函数与vfork函数的区别
a、vfork直接使用父进程存储空间,不拷贝。
b、vfork保证子进程先运行,当子进程调用exit (0)退出后,父进程才执行。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid;
pid=vfork();
while(1)
{
if(pid > 0)
{
printf("this is fathe pid:%d\n",getpid());
sleep(3);
}
else if(pid == 0)
{
printf("this is child pid :%d\n",getpid());
exit(0);
}
}
return 0;
}
如果子进程退出的状态 没有被收回就会被变成僵尸进程,处理僵尸进程使用wait()函数,当当调用wait()函数后,父进程等待子进程处理完后再进行处理父进程。使用WEXITSTATUS() 来解析子进程是以什么样的状态退出。
当使用wait()时会堵塞,如果不想被堵塞则使用waitpid()函数处理 方法和wait()一样。其option模式一般使用WNOHANG模式 。但通过实际的测试子进程会变成僵尸进程
waitpid(pid,&status,WNOHANG);
孤儿进程
父进程不等待子进程退出,在子进程结束之前就结束了自己的生命–孤儿进程
Linux避免太多的孤儿进程,init进程收留孤儿进程,变成其父进程
init 进程pid为 1,可调用getppid()来获取其ID号