fork函数和vfork函数

fork函数:

功能:创建子进程

      fork的奇妙之处在于它被调用一次,却返回两次它可能有三种不同的返回值:

1、在父进程中,fork返回新创建的子进程的PID;

2、在子进程中,fork返回0

3、如果出现错误,fork返回一个负值

#include <stdio.h>
#include <unistd.h>

int main()
{
	printf("main pid: %d\n",getpid());
	pid_t pid = fork();
	if(-1 == pid)
	{
		perror("fork");
		return 1;
	}

	if(0 == pid)
	{
		printf("Child Process : ");
		printf("pid = %d,ppid = %d\n",getpid(),getppid());
	}
	else if(pid > 0)
	{
		printf("Parent Process : ");
		printf("childpid = %d,pid = %d\n",pid,getpid());
	}

    return 0;
}

执行结果如下:

父进程的pid等于子进程的pid加1.

vfork函数:

vfork函数创建的新进程,刚开始时会暂时与父进程共享地址空间。另外,vfork函数保证子进程先运行,在它调用exit之后(关键)父进程才可能被调度运行。

 

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
	int a = 10;
	pid_t pid = vfork();
	int b = 10;           
	if(-1 == pid)
	{
		perror("vfork");
		exit(1);
	}

	if(0 == pid)
	{
		sleep(2);
		a++;
		b++;
		printf("this is child : a = %d,b = %d\n",a,b);
		exit(2);
	}
	else if(pid > 0)
	{
		printf("this is parent : a = %d,b = %d\n",a,b);
	}

    return 0;
}

执行结果如下:

 在vfork()前后声明的变量,运行结果有何不同?真正共享的是之前的还是之后的?

在vfork()前声明的变量会被子进程改变,在vfork()后声明的变量不会被子进程改变,所以真正共享的是之前的。

此外,我在代码的子进程中加了一个2秒的延迟,事实证明调用vfork函数,先执行的一定是子进程。

fork函数与vfork函数的区别:

           1.   fork:子进程拷贝父进程的数据段     

              vfork:子进程与父进程共享数据段

 

           2.   fork:父、子进程的执行次序不确定 

              vfork:子进程先运行,父进程后运行

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值