C 为什么输出打印两次?

C 为什么输出打印两次?,c,fork,wait,C,Fork,Wait,也许对你们大多数人来说这看起来很幼稚,但我无法理解这段小代码 #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("Forki

也许对你们大多数人来说这看起来很幼稚,但我无法理解这段小代码

#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);
}
在for循环中,printf命令只使用一次。为什么要“分叉pid”,之后pid会打印两次。这是怎么回事?谁能给我解释一下吗?提前谢谢。 有人能解释一下为什么我们要在这里等吗?我从手册页了解到的是等待将控件重新运行到父进程?我所理解的是正确的吗?是否有必要在分叉过程后使用wait?
操作系统:ubuntu、编译器:gcc、IDE:netbeans

您正在两个进程中打印。将打印循环放入
if(pid)
else
子句中:

pid=fork();
如果(pid)
{
printf(“子pid:%d\n”,pid);
等待(空);
}
其他的
{

对于(i=0;i,因为父进程和子进程都在输出结果


请参见此处:获取一个好的示例。

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


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

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

但这正是
fork
所做的。您分叉了进程,并且在
fork
之后的所有操作都完成了两次,因为现在有两个进程执行相同的打印代码。您基本上是在问为什么
fork
叉子。
fork
叉子,因为它应该叉子。这就是它的用途

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


在您的情况下,
wait
函数仅从父进程执行。它使它等待直到子进程终止,并且只有在子进程终止之后,父进程才能继续终止。在这个特定示例中调用
wait
并不是很关键,因为程序在此之后什么都不做,它只是终止。B例如,如果您希望从子进程接收到一些反馈到父进程中,并在父进程中对这些反馈执行一些额外的工作,那么您必须使用
wait
等待子进程完成其执行。

Er…但这正是
fork
所做的!您将该进程和ev分开了fork之后的任何事情都要做两次,因为现在你有两个进程!你基本上是在问为什么
fork
fork!它的可能重复不是任何其他问题的重复,但可能是你提供的链接将帮助我进一步理解fork。问题已编辑。现在是关于等待功能。对不起,我不明白。你能理解吗硼酸盐?
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 ...
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());
}