Linux--进程(vfork)
一、概述
vfork()函数:
不创建父进程的副本,相反父子进程共享数据,CW技术不适用。
和fork()异同点:
1> fork(): 父子进程的执行次序不确定。
vfork():保证子进程先运行,在它调用 exec(进程替换) 或 exit(退出进程)之后父进程才可
能被调度运行。
2> fork(): 子进程拷贝父进程的地址空间,子进程是父进程的一个复制品。
vfork():子进程共享父进程的地址空间(准确来说,在调用 exec(进程替换) 或 exit(退出
进程) 之前与父进程数据是共享的)。

例程1:子先父后
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
pid_t pid;
pid = vfork(); // 创建进程
if(pid < 0){ // 出错
perror("vfork");
}
if(0 == pid){
sleep(10);
printf("child\n");
_exit(0);
}else if(pid > 0){
printf("parent\n");
}
return 0;
}
执行:gcc Tvfork.c -o Tvfork -Wall
./Tvfork
child
parent
上诉先输出子进程在输出父进程
例程2:共享
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int data = 10;
int main(int argc, char *argv[])
{
pid_t pid;
int sum = 20;
pid = vfork();
if(pid < 0){
perror("vfork");
}
if(0 == pid){
data = 100, sum = 200;
printf("child: data = %d, sum = %d\n", data, sum);
_exit(0);
}else if(pid > 0){
printf("father: data = %d, sum = %d\n", data, sum);
}
return 0;
}
输出结果是一样的。
例程3:子先,调用exec、exit后父进程才调用,没调用就死锁。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
pid_t pid;
pid = vfork();
if(pid < 0){
perror("vfork");
}
if(0 == pid){
printf("child\n");
sleep(1);
}else if(pid > 0){
printf("parent\n");
sleep(1);
}
return 0;
}
没有调用exec、exit会无限循环
具体见man手册