【问题标题】:Problem with Multiple Process Execution in cc中多进程执行的问题
【发布时间】:2020-12-04 05:03:43
【问题描述】:

我目前正在尝试创建 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。因此,您正在创建两个以上的子进程。
  • OT:函数:fork()返回3种信息:0表示在父进程中。您的代码应该检查所有 3 个条件

标签: c linux process ipc


【解决方案1】:

在第一个fork 调用之后,第一个子进程继续执行程序的其余部分,即父进程和第一个子进程都再次调用fork

你只是退出第一个子进程,这样只有父进程调用第二个fork:

if((childPid[0] = fork()) == 0) {
    printf("Hello I'm process one\n");
    exit(0);
}

【讨论】:

  • 我几乎理解了这个想法,你是说一旦进程完成工作,我需要使用 exit(0),因为如果我不这样做,该进程将继续执行后面的代码。所以就像当我创建一个新进程时,如果我不退出或类似的东西,它会继承后面的代码?
  • 退出,将控制权交还给父进程
  • fork 复制调用进程,从那时起的所有内容都将在两个进程中执行。 “退出,将控制权交还给父进程” - 不,退出只是结束 那个 进程 - 那里没有“给予控制权”。不管怎样,父级继续运行。退出是为了防止子进程执行程序的其余部分。
【解决方案2】:

在以下代码中,您生成了一个子进程,并且有 2 个进程正在运行,父进程和子进程。父进程可以通过fork() 的返回值来标识,它会打印一条消息但没有退出。这就是您在下一个 printf() 结果中看到更多消息的原因。

if((childPid[0] = fork()) == 0)
        printf("Hello I'm process one\n");

由于父子进程都没有退出,下面的代码会被父子进程2个进程执行,导致显示相同的消息两次。

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);
}

【讨论】:

  • 谢谢约翰的解释
猜你喜欢
  • 1970-01-01
  • 2011-03-26
  • 2014-06-17
  • 2016-06-22
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多