Linux--進(jìn)程(vfork)
一、概述
vfork()函數(shù):
不創(chuàng)建父進(jìn)程的副本,相反父子進(jìn)程共享數(shù)據(jù),CW技術(shù)不適用。
和fork()異同點(diǎn):
1> fork(): 父子進(jìn)程的執(zhí)行次序不確定。
vfork():保證子進(jìn)程先運(yùn)行,在它調(diào)用 exec(進(jìn)程替換) 或 exit(退出進(jìn)程)之后父進(jìn)程才可
能被調(diào)度運(yùn)行。
2> fork(): 子進(jìn)程拷貝父進(jìn)程的地址空間,子進(jìn)程是父進(jìn)程的一個(gè)復(fù)制品。
?vfork():子進(jìn)程共享父進(jìn)程的地址空間(準(zhǔn)確來說,在調(diào)用 exec(進(jìn)程替換) 或 exit(退出
進(jìn)程) 之前與父進(jìn)程數(shù)據(jù)是共享的)。

例程1:子先父后
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
?int main(int argc, char *argv[])
{
pid_t pid;
pid = vfork(); // 創(chuàng)建進(jìn)程
if(pid < 0){ // 出錯(cuò)
perror("vfork");
}
if(0 == pid){?
sleep(10);
printf("child\n");
_exit(0);?
}else if(pid > 0){?
printf("parent\n");
}
return 0;
}
執(zhí)行:gcc? Tvfork.c? -o Tvfork -Wall
? ? ? ? ? ./Tvfork
child
parent
上訴先輸出子進(jìn)程在輸出父進(jìn)程
例程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;
}
輸出結(jié)果是一樣的。
例程3:子先,調(diào)用exec、exit后父進(jìn)程才調(diào)用,沒調(diào)用就死鎖。
#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;
}
沒有調(diào)用exec、exit會(huì)無限循環(huán)
具體見man手冊(cè)