创建子进程函数fork与vfork 区别

本文详细讲解了如何使用fork函数创建子进程,并比较了它与vfork的区别。重点讨论了孤儿进程的概念,以及如何通过wait和waitpid处理子进程退出。同时涵盖了Linux系统中init进程的作用。

创建子进程

我们可以通过调用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号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值