2013-01-19 49 views
-3

我写了一个程序Linux的fork()的命令

#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 
    int returnVal = fork(); 
    printf("Return Value: %i\n", returnVal); 
    return 1; 
} 

当我编译这个和运行,我得到我已经给只有一个printf语句,则下面的输出 为什么我看到2个打印。如果我删除了打印,则不会打印任何内容。

[email protected]:~/Projects/Nix$ ./a.out 
Return Value: 5547 
Return Value: 0 
+4

您确定您已阅读过'man fork'吗? –

+0

您正在使用'fork';你期望什么? –

+0

为什么我的问题投下了票? –

回答

7

你需要通过man命令:-)

检查:pid_t fork(void);

fork()通过复制调用过程创建一个新过程。被称为孩子的这个新过程是与调用过程(称为父母)完全相同。

详情::首先你执行了你的代码,它创建了一个子进程。现在你有两个进程执行同一段代码。所以两个打印语句,第一个父进程和第二个子进程。

+0

感谢您的详细解释 –

+2

它需要一段时间来接受答案:P –

+0

检查:[帮助中心](http://stackoverflow.com/posts/14414571/revisions) –

4

fork创建一个新的过程。所以有两个进程执行下一个语句。父进程具有returnVal = 5547(子进程PID)和子进程returnVal = 0

fork()函数将创建一个新的进程。新进程(子进程)应调用进程的精确副本(父进程)

+0

我知道fork返回2个值,但是当我只给出一个printf语句时,它如何打印它两次是我的问题 –

+1

@Alwin Doss:两个进程执行相同的源代码。 ;-) – md5

+1

Cuz子进程再次执行相同的代码。所以它再次打印一个返回值。 – Abhineet

6

在程序中printf语句执行twice,因为一旦叉是成功的,该程序是由two processeschildparent进程)控制。所以这里的printf,由两个孩子和家长实行的处理

要避免这种行为,在程序中使用叉()使用三种不同的条件检查总是很好()

int pid; 
if((pid = fork()) == -1) 
{ //fork unsuccessful 
} 
else if (pid > 0) 
{ //This is parent 
} 
else 
{//This is child 
} 
+0

为什么我的答案downvoted? –

+0

您的文本需要改进:1)printf()打印子进程ID和'0'。 2)孩子不是用'0'的pid创建的。 3)错误由'-1'返回。 – pmg

+0

@pmg根据您的意见编辑答案。谢谢。 –