man(2) V


vfork(2) 

#include <sys/types.h>
#include <unistd.h>

pid_t vfork(void);

功能:创建子进程并阻塞父进

----------------------------------------------------

1 #include<sys/types.h>
2 #include<unistd.h>
3 #include<stdio.h>
4 int main()
5 {
6 pid_t pid;
7 int cnt = 0;
8 pid = fork();
9 if(pid<0)
10 printf("error in fork! ");
11 else if(pid == 0)
12 {
13 cnt++;
14 printf("cnt=%d ",cnt);
15 printf("I am the child process,ID is %d ",getpid());
16 }
17 else
18 {
19 cnt++;
20 printf("cnt=%d ",cnt);
21 printf("I am the parent process,ID is %d ",getpid());
22 }
23 return 0;
24 }

运行结果:

cnt = 1

I am the child process,ID is 14735

cnt = 1

I am the parent process,ID is 14736

证明子进程拷贝父进程的数据段,代码段

int main()
{

pid_t pid;
int cnt = 0;
pid = vfork();
if(pid<0)
printf("error in fork! ");
else if(pid == 0)
{
cnt++;
printf("cnt=%d ",cnt);
printf("I am the child process,ID is %d ",getpid());
// _exit(0);//注释这个就出现段错误
}
else
{
cnt++;
printf("cnt=%d ",cnt);
printf("I am the parent process,ID is %d ",getpid());
}
return 0;

}

1注释掉exit就段错误

vfork 保证子进程先运行,在她调用exec 或exit 之 
后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动 
作,则会导致死锁。 

2不注释

cnt = 2  子进程与父进程共享数据段.man

------------------------------------------------------------------------

fork与vfork的区别

1. fork():子进程拷贝父进程的数据段,代码段. vfork():子进程与父进程共享数据段.

2. fork():父子进程的执行次序不确定.vfork():保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。

3. vfork()保证子进程先运行,在她调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

4.当需要改变共享数据段中变量的值,则拷贝父进程。

https://www.cnblogs.com/lovemdx/p/3308057.html

----------------------------------------

vhangup(2)

vm86(2) vm86old(2) vmsplice(2) vserver(2)

原文地址:https://www.cnblogs.com/xpylovely/p/11018054.html