【问题标题】:How to display child processes using pstree in C如何在 C 中使用 pstree 显示子进程
【发布时间】:2019-09-18 01:57:20
【问题描述】:

有人问我关于创建一个程序,其中一个进程生成 32 个子进程的问题。我在下面创建了程序(正确吗?),但是您知道如何使用 pstree 命令显示这些进程的树吗?感谢任何帮助。

#int main()
{
    for(int i = 0; i < 32; ++i)
    {
        if(fork() == 0)
        {
            sleep(5);
            return 0;
        }
    }
    for(int i = 0; i < 32; ++i)
    {
        waitpid(-1, NULL, 0);
    }
    return 0;
}: 

【问题讨论】:

  • 你读过 pstree 的手册页吗? man7.org/linux/man-pages/man1/pstree.1.html
  • 顺便说一句,为什么 waitpid() 在外部单独的 for 循环中?您可以将waitpid() 语句保留在ifelse 块中。
  • 如@KillianG 所述。你应该看看 pstree 的手册页。相同的进程被组合在一起,因此如果您使用父进程 id 运行 pstree,您将获得类似以下测试的输出───32*[test]。
  • Achal,您能否说明如何使用 else 而不是单独的 for 循环来重写它?提前致谢!

标签: c linux shell


【解决方案1】:

对我来说,在添加几行 #include 之后就可以了,如下所示:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
  for(int i = 0; i < 32; ++i) {
    if(fork() == 0) {
      sleep(30);
      return 0;
    }
  }
  for(int i = 0; i < 32; ++i)
    waitpid(-1, NULL, 0);
  return 0;
}

然后我就可以编译了:

gcc pp.c -o myprog

生成 myprog 可执行文件。然后我运行它,当它运行时我可以打开另一个终端窗口并在那里运行pstree,然后它会显示父进程和32个子进程,它看起来像这样:

systemd-+-[...]
        |-[...other stuff...]
        |-systemd-+-(sd-pam)
        |         |-[...other stuff...]
        |         |-gnome-terminal--+-bash---myprog---32*[myprog]
        |         |                 |-bash---pstree
        |         |                 `-4*[{gnome-terminal-}]
        |         |-[...other stuff...]

我猜bash---myprog---32*[myprog] 部分意味着myprog 进程创建了32 个子myprog 进程,所以它似乎按预期工作。

【讨论】:

  • 太好了,效果很好!谢谢你。我能否再请您帮个忙,向我解释一下这两个 for 循环是如何协同工作的(是的,在创建程序时我正在使用外部帮助)。我的意思是第一个是使用 fork() 创建新的子进程,并将它们置于 sleep() 状态。在第一个完成后,它进入第二个“for”循环并通过使用 waitpid(-1, NULL, 0) - 子进程等待状态从 -1 变为 0,对吗?意思是第二个循环“搁置”第一个循环创建的所有子进程?
猜你喜欢
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2012-07-17
相关资源
最近更新 更多