为什么vfork()会导致父进程崩溃(段错误)?

时间:2013-11-23 04:07:08

标签: c fork vfork

vfork可以在父进程中更改变量,但为什么不能增加堆栈?

void f1()
{
    vfork();
}

f2()导致崩溃。

void f2()
{
    char buf[100];
}


int main()
{
    f1();
    f2();
    _exit(0);                                                                                                                                    
}

如果我将vfork()更改为fork(),则不会发生崩溃。

1 个答案:

答案 0 :(得分:5)

调用vfork()后,您唯一允许执行的操作是执行文件。它在the documentation:

中是正确的
  

vfork()函数应等效于fork(),但如果由vfork()创建的进程修改 pid_t类型的变量以外的任何数据,则行为未定义用于存储vfork()的返回值,或者从调用vfork()的函数返回,或者在成功调用_exit()或其中一个函数之前调用任何其他函数{1}}一系列功能。

     

...   >   除{作为立即调用exec系列函数或vfork()函数的前奏之外,不建议将exec用于任何目的。

即便如此,唯一合法的电话是_exit()exec*