【问题标题】:Create process tree in particular order using fork()使用 fork() 按特定顺序创建进程树
【发布时间】:2020-04-17 22:00:59
【问题描述】:

我尝试在 C 中创建一个进程树,如下图所示:

请注意,必须按照字母顺序创建进程树。

我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(int argc, char **argv)
{
    pid_t b,c,d,e,f,g,h;
    if(b = fork() == 0)
    {
        if(e = fork() == 0){}
        else
        {
            if(f = fork() == 0)
            {
               sleep(1);
               if(h = fork() == 0){}
            }
        }
    }
    else
    {
        if(c = fork() == 0)
        {
            sleep(0.5);
            if(g = fork() == 0){}
        }
        else
        {
            if(d = fork() == 0){}
        }
    }
    return 0;
}

我使用 sleep 来延迟进程,以便可以按正确的顺序创建它们。但我认为这不是正确的方法,谁能告诉我正确和更可靠的方法?

【问题讨论】:

  • 我的第一个注释是,if(e = fork() == 0)if((e = fork()) == 0) 不同。因此,如果您运行的实际代码在这两者之间存在差异,它们实际上都应该是后者(第一个 if(e = fork() == 0) 将确定 fork() == 0true 还是 false,然后分配 @987654330 @ 是那个布尔值(如果没有发生错误,true 很可能被转换为 1false0

标签: c process fork


【解决方案1】:

您是正确的,使用 sleeps 不是正确的方法。您将需要使用某种形式的进程间通信 (IPC)。

我建议最简单的方法是在父子之间使用管道。它需要多层次来支持 B、C 和 E 之间的关系。

类似:

  • 每个进程在启动时立即打印其字母
  • 每个进程(A 除外)然后向其父进程发送“ok”
  • 每个进程(A 除外)然后等待来自其父进程的“go”消息。
  • 当它收到“go”消息时,它会按顺序创建每个子节点,等待从每个子节点接收“ok”,然后再创建下一个。
  • 当它从最后一个子节点收到“ok”时,它会向其父节点发送“ok”,除非它是 A(没有父节点),在这种情况下,它会依次向每个子节点发送“go” ,等待收到“ok”,然后再转到下一个孩子。
  • 在创建其子进程后,当进程从其父进程接收到“go”时,它会依次向其每个子进程发送“go”,等待从每个子进程收到“ok”,然后再继续下一个。李>

这应该是大部分的解决方案,但并不完整。你需要某种整理逻辑。我会建议像

  • 当没有子进程的进程从其父进程接收到“go”时,它会将“done”发送回父进程。
  • 当一个进程从它的所有子进程中收到“done”时,它会将“done”发送给它的父进程。
  • 当进程 A 收到所有子进程的“完成”时,游戏结束,每个人都可以收拾行李回家了。

你需要一个比嵌套的 if/else 块更好的结构。我建议在文件顶部的静态变量中创建某种简单的表来映射每个节点具有哪些子节点,并在分叉之前将变量设置为进程的名称。

在本练习中,函数将非常适合您。

【讨论】:

  • 感谢您的帮助。你能具体告诉我子进程如何等待来自其父进程的消息吗?
  • pipe() 调用创建了两个文件描述符,一个用于读取,一个用于写入。因此,您可以在读取端文件描述符上使用read() 来等待管道中出现某些内容。我建议使用 fork 和 pipe 做一些玩具程序 - 网络上有大量文章介绍如何使用这两个概念在父进程和子进程之间进行对话。
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 2014-07-27
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2014-05-28
  • 2021-07-09
  • 1970-01-01
相关资源
最近更新 更多