2010-09-29 147 views
0

对大多数人来说,看起来可能是幼稚的,但我无法理解这段小小的代码。为什么输出打印两次?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
int main(int argc, char** argv) { 
    int i, pid; 
    pid = fork(); 
    printf("Forking the pid: %d\n",pid); 
    for(i =0; i<5; i++) 
     printf("%d %d\n", i,getpid()); 
    if(pid) 
     wait(NULL); 
    return (0); 
} 

停止把这个程序的是

Forking the pid: 2223 
0 2221 
1 2221 
2 2221 
3 2221 
4 2221 
Forking the pid: 0 
0 2223 
1 2223 
2 2223 
3 2223 
4 2223 
Press [Enter] to close the terminal ... 

在for循环printf命令被使用一次。为什么“分叉pid”,然后再打印两次pid。这是如何工作的?有人可以解释我吗?提前致谢。 有人可以解释我为什么要在这里等待吗?我从手册页中了解到的是等待将控制权转回到父进程?我所理解的是正确的吗?分流后是否需要等待? 操作系统:ubuntu,编译器:gcc,IDE:netbeans

+1

呃......但那正是叉子的功能!你分叉了这个过程以及fork完成两次后的所有事情,因为现在你有两个*进程!你基本上是问为什么'叉'叉! – AnT 2010-09-29 14:48:37

+0

[此C代码可以做什么?]可能的重复(http://stackoverflow.com/questions/3730429/what-does-this-c-code-do) – 2010-09-29 14:49:52

+0

它不是任何其他问题的重复,但可能是您提供的链接将帮助我进一步了解分叉。 – narayanpatra 2010-09-29 15:12:59

回答

3

但这正是fork所做的。您分叉进程和fork两次之后的所有内容,因为现在您有两个进程执行相同的打印代码。你基本上是问为什么fork叉。 fork叉因为是应该分叉。这就是它的目的。

fork之后,父进程和子进程通常并行执行,这意味着您在示例中看到的很好的顺序输出无法保证。您可能很容易以两个进程的行交错输出结束。

wait函数在你的情况下只能从父进程执行。它使其等待,直到子进程终止,并且只有在父进程也继续终止之后。在这个特殊的例子中调用wait并不重要,因为程序在此之后什么都不做,它只是终止。但是,例如,如果您想从子进程收到一些反馈到父进程中,并在父进程中针对该反馈做了一些额外的工作,则必须使用wait来等待子进程完成其执行。

+0

感谢哥们。我知道了。 – narayanpatra 2010-09-29 14:53:37

1

您正在两个进程中打印。把你的打印循环中if (pid)else条款:

pid = fork(); 
if(pid) 
{ 
    printf("Child pid: %d\n",pid); 
    wait(NULL); 
} 
else 
{ 
    for(i =0; i<5; i++) 
     printf("%d %d\n", i,getpid()); 
} 

你看,fork返回两次,一次在父进程,一旦在子进程。它在子项中返回0,并在父项中返回创建的进程的PID。

+0

对不起,我无法理解。你能详细说明吗? – narayanpatra 2010-09-29 14:49:28

+0

谢谢,它有帮助。 – narayanpatra 2010-09-29 14:57:44

0

fork创建一个新进程,并在旧进程(父进程)和新进程(子进程)中都返回。

您可以通过查看fork的返回值来判断您处于哪个位置。在父进程中,它返回子进程的PID。在子进程中,它返回0

3

fork()调用会产生一个新进程。然后从两个进程中的每一个执行其余代码。 (Man page)