为什么vfork产生这个输出?

时间:2014-01-21 10:53:18

标签: c linux unix process

#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());
}

上述程序的输出是:

process id:9956
f2:process id:9957

Vfork确保子进程在父进程之前执行,因此我认为从函数f1()返回时,子进程将执行f2(),然后执行_exit(0);之后,为什么父进程不执行函数f2()

1 个答案:

答案 0 :(得分:2)

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

  

vfork()函数与fork(2)具有相同的效果,除了   如果由vfork()创建的进程也是行为未定义   修改除用于存储的pid_t类型的变量之外的任何数据   来自vfork(),的返回值或从其中返回的函数返回   vfork()在成功之前被调用,或调用任何其他函数   调用_exit(2)或exec(3)函数族之一