2011-06-17 42 views
0

fork()用于创建子进程...并且您看到此调用也出现在子进程中。当他们说'调用fork实际返回两次'时,我不明白它意味着什么。fork()调用,复制进程

而且这是什么意思?

if (fork() == 0) 
/* the child process's thread executes here*/ 

else 
/*the parent process's thread executes here*/ 

是父母或子女的上面的代码部分。你能用简单的英语来解释发生了什么事吗?

另外,为什么要使用fork()?它说这个系统调用运行在unix中的所有进程?你如何fork()所以其他程序可以运行?你是否指定了程序的名称?

回答

1

他们说它返回两次的意思是,调用在父进程(它调用它)返回一次,并且一次在子进程中(它没有,尽管你可能会争辩说子继承从父母那里调用fork的行为就像它继承了其他许多事情一样)。

代码片段利用了从fork获取不同返回值的事实,具体取决于您是父进程还是子进程。

子进程获取零并且父进程获取子进程的非零进程标识。

如果fork由于某种原因失败,您也可以返回-1,在这种情况下,孩子将不会运行。这也是你应该检查的东西。

而且,尽管fork用于创建新过程,它的exec家族新程序加载到这些进程的呼叫:fork对自己不能做到这一点。

该过程的一个很好的概述可以找到here

1

这有点像这样:

Process 1    Process 2 

int main() { 
    ... 
    int x = goo(); 
    ... 
    int y = fork(); 
    // fork() returns... // ... but also here! 

    // here y = 123   // here y = 0 
    if (y) {    if (y) { 
    // this happens   // false 
    } else {    } else { 
    // false    // this happens 
    }      } 

    int z = baz();   int z = baz(); 
    ...      ... 
    return 0;    return 0; 
}      } 

当过程2来生活,程序存在两次,和第二过程用叉的返回开始()。由于程序在两个进程中都是相同的,因此区分进程的唯一方法是fork()的返回值。