C语言fork函数与vfork函数的区别

本文介绍了Linux中用于创建子进程的fork和vfork函数,详细阐述了它们的功能、返回值以及使用场景。fork创建的子进程与父进程拥有独立的内存空间,而vfork保证子进程先运行,并与父进程共享地址空间。示例代码展示了如何在C语言中使用这两个函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、函数原型

1、fork

#include <sys/types.h>
#include <unistd.h>//头文件

pid_t fork(void);//函数原型

返回值:

返回父进程的pid;

子进程:返回0;

错误:返回-1;

2、vfork

#include <sys/types.h>
#include <unistd.h>//头文件

pid_t vfork(void);函数原型

 返回值:

成功:子进程中返回 0,父进程中返回子进程 ID。

失败:返回 -1。

二、函数功能

1.fork

create a child process--创建一个子进程

fork通过复制调用进程来创建一个新进程。新进程称为子进程,调用进程称为父进程

在使用fork时,两个内存空间具有相同的内容。子进程和父进程并行执行。(注意:子进程和父进程的执行顺序是不确定的)当父进程死亡后,子进程称为孤儿进程,会被init进程收养。

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
	pid_t pid = fork();
	if(pid < 0)
	{
		perror("pid_t");
		return -1;
	}
	if(pid == 0)
	{
		printf("parent pid = %d,child pid = %d\n",getppid(),getpid());
		exit(0);//使子进程正常结束
	}
	else
	{
		int status;
		//sleep(1);//sleep可以使当前主进程睡眠,执行子进程
		wait(&status);//阻塞函数,等待子进程结束
		printf("status = %d\n",WEXITSTATUS(status));
		printf("parent pid = %d,my parent  pid =%d\n",getppid(),getpid());
	}
	return 0;
}

2.vfork

-----create a child process and block parent   ------创建子进程并阻止父进程

vfork与fork具有相同的效果,不同的是,vfork保证子进程先运行,子进程结束了或在使用了exec/exit后,父进程才能运行。

注意:与父进程共享地址空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值