问题描述
我当前正在尝试创建2个子进程,每个子进程都打印一些内容,问题是该进程之一打印了两次'printf'指令。 这是代码:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
pid_t childPid[2];
if((childPid[0] = fork()) == 0)
printf("Hello I'm process one\n");
if((childPid[1] = fork()) == 0)
printf("Hello I'm process two\n");
return 0;
}
这是编译和运行后的结果:
Hello I'm process one
Hello I'm process two
Hello I'm process two
请解释一下为什么第二个进程执行两次。
解决方法
在第一次fork
调用之后,第一个子进程也继续执行程序的其余部分,即父级和第一个子进程都再次调用fork
。
您只是要退出第一个子进程,以便只有父进程才能调用第二个fork:
if((childPid[0] = fork()) == 0) {
printf("Hello I'm process one\n");
exit(0);
}
,
在下面的代码中,您生成了一个子进程,并且有两个正在运行的父进程和子进程。可以通过返回值fork()
来标识父进程,该返回值将显示一条消息,但是没有退出。这就是为什么您在下一个printf()
结果中看到多条消息的原因。
if((childPid[0] = fork()) == 0)
printf("Hello I'm process one\n");
由于父级或子级都没有退出,因此以下代码将由父级和子级两个进程执行,导致两次显示相同的消息。
if((childPid[1] = fork()) == 0)
printf("Hello I'm process two\n");
通常子进程执行附加作业并返回,而父进程继续其主要流程。因此,我更喜欢写作,
childPid[0]=fork();
if(childPid[0]<0)
{
// error
}
else if(childPid[0] == 0) // following code would be executed by child process only
{
printf("Hello I'm Child process two\n");
exit(EXIT_SUCCESS);
}