2014-01-21 245 views
0
#include <unistd.h> 
#include <stdio.h> 

static void f1(void); 
static void f2(void); 

int main(void) 
{ 
    printf("process id:%d\n", getpid()); 
    f1(); 
    f2(); 
    _exit(0); 
} 

static void f1(void) 
{ 
    pid_t pid; 

    if((pid = vfork()) < 0) 
    { 
     printf("vfork error\n"); 
    } 
} 
static void f2(void) 
{ 
    char buf[1000]; 
    int i; 

    for(i = 0; i < sizeof(buf); i++) 
    { 
     buf[i] = 0; 
    } 

    printf("f2:process id:%d\n", getpid()); 
} 

上述程序的输出是:为什么vfork产生这个输出?

process id:9956 
f2:process id:9957 

Vfork确保母体之前的子进程执行,所以我认为当从函数返回f1(),子进程将执行f2(),然后_exit(0);之后,为什么父进程不执行功能f2()

+0

我在你的例子中只能找到'fork()' –

+0

@skwllsp对不起,我错过了键入的vfork .. – Charles0429

回答

2

我假设你错打了fork而不是vfork在问题正文中。如果是这种情况,你就错用了vfork。一旦您发出vfork,您不应该对exec以外的孩子做任何事情或退出。

该了vfork()函数具有作为叉相同的效果(2),不同之处在于 行为未定义如果()由vfork的创建的过程要么 修改比类型将为pid_t的变量之外的任何数据用于存储来自vfork(),的返回值 或从调用函数 vfork()返回的值,或在调用_exit(2)或exec(3)系列之一调用任何其他函数之前的功能

+0

你的意思是说,如果我使用vfork,那么我不应该在子进程中调用任何函数?基本声明是允许的? – Charles0429

+1

@ Charles0429您可以执行或调用'_exit'。特别是,您应该努力不要因为属于父级而更改流程空间。 – cnicutar

相关问题