Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 工作一去不复返_C_Linux_Fork - Fatal编程技术网

C 工作一去不复返

C 工作一去不复返,c,linux,fork,C,Linux,Fork,为什么这个程序永远不会返回并继续创建子进程 int main() { pid_t pid; int foo1 = 1, foo2 = 2; printf("before fork()\n"); if ((pid = vfork()) < 0 ) { printf("fork failed.\n"); }else if (pid == 0) { foo1++; foo2++;

为什么这个程序永远不会返回并继续创建子进程

int main()
{
    pid_t pid;
    int foo1 = 1, foo2 = 2;
    printf("before fork()\n");

    if ((pid = vfork()) < 0 ) {
            printf("fork failed.\n");
    }else if (pid == 0) {
            foo1++;
            foo2++;
            printf("child process: pid is %d, my parent pid is  %d\n", getpid(), getppid());
    }else if (pid > 0){
            printf("parent process: pid is %d\n", getpid());
    }

    printf("%s: foo1 is %d, foo2 is %d\n",pid == 0 ? "child process" : "parent process", foo1, foo2);
    return 0;
}
如果在第二个If块中添加一个_出口,那么它就可以了。
我知道vWork与父进程共享相同的地址空间,但是,如果程序以崩溃而不是无休止的循环结束,则更为合理。

vWork
是一个非常复杂的系统调用,它唯一的预期用途是立即在子系统中设置一个
execve
,对于其他类型的使用,它是危险和不可预测的

另请注意,与使用
fork
不同,父级将挂起,直到子级退出或调用手册中的
execve

如果vfork()创建的进程修改除用于存储vfork()返回值的pid类型变量以外的任何数据,或从调用vfork()的函数返回,或在成功调用_exit()或exec函数族之一之前调用任何其他函数,则该行为是未定义的


因为父级和子级共享地址空间,所以不能从调用vWork()的函数返回这样做会损坏父级堆栈

在vfork子代中,您只能调用安全的函数来调用信号处理程序,因此从vfork内部printf是一个非常糟糕的主意。

谢谢。用“退出(0)”替换“返回0”后,程序按预期运行。我认为“返回”是无休止循环的原因。是的,你正在用
返回
@deepsky:也不要从孩子那里调用
exit()
,调用
\u exit()
@deepsky:事实上,不要使用
vfork()
谢谢大家。我只是好奇为什么这些会导致一个无休止的循环。这真是巧合。
before fork()
child process: pid is 17244, my parent pid is  15839
child process: foo1 is 2, foo2 is 3
parent process: pid is 15839
parent process: foo1 is -1079005816, foo2 is -1218256081
before fork()
child process: pid is 17245, my parent pid is  15839
child process: foo1 is 2, foo2 is 3
parent process: pid is 15839
parent process: foo1 is -1079005816, foo2 is -1218256081
before fork()
.....
.....