c中的多进程执行问题

问题描述

我当前正在尝试创建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);
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...