gpt4 book ai didi

c - 如何打印由c中的fork命令创建的进程树

转载 作者:行者123 更新时间:2023-11-30 20:19:17 25 4
gpt4 key购买 nike

我通过组合 C 中的 fork 命令创建了一棵叉树。创建树的程序是:

int main(){

(fork()&&(fork()&&(fork()||(fork()&&fork())&&fork())||(fork()||(fork()&&fork()))))||(fork()||(fork()&&fork()));

while(1);

return 0;
}

该命令是用C 文件编写的。如何打印由此代码创建的进程树?

最佳答案

我会让程序以 Graphviz DOT 格式打印树,作为有向图。在您的情况下,输出将类似于

digraph {
"a" -> "b";
"a" -> "c";
"b" -> "d";
}

其中每个进程(除了第一个进程)都打印一行包含 -> 的行:其自己的 PID 在右侧的引号中,其父级 PID 在左侧的引号中。

初始进程打印 digraph {} 部分,但请注意,每个进程必须等待其子进程才能结束 } 最后打印。您可以通过在该行之前保存进程 ID 来实现这一点,并在收获所有子进程之后,如果该进程 ID 与原始进程 ID 匹配,则打印结束 }

要收获 child ,请将无限循环替换为例如

pid_t  p;

while (1) {
p = wait(NULL);
if (p == -1 && errno != EINTR)
break;
}

等待当前进程的所有子进程退出。

在 Linux 系统中,您的软件包/软件管理器将具有 Graphviz 软件包,因此从那里安装它。 (对于非 Linux 系统,请参阅 graphviz.org。)

运行程序,但将 DOT 输出重定向到文件,例如 out.dot。然后,运行 dot -Tx11 out.dot 以交互方式查看图形,或运行 dot -Tsvg out.dot > out.svg 生成 SVG 图像 (out .svg),您可以在任何浏览器中查看。

这是经过正确修改的程序可以输出的一种可能的 .dot 输出:

digraph {
"944" -> "945";
"944" -> "946";
"944" -> "947";
"947" -> "950";
"945" -> "948";
"947" -> "951";
"946" -> "949";
"950" -> "953";
"947" -> "952";
"948" -> "956";
"951" -> "955";
"949" -> "957";
"948" -> "954";
"953" -> "958";
"957" -> "963";
"955" -> "964";
"949" -> "959";
"953" -> "961";
"955" -> "962";
"963" -> "968";
"952" -> "960";
"959" -> "966";
"962" -> "969";
"963" -> "965";
"958" -> "973";
"960" -> "971";
"964" -> "967";
"969" -> "975";
"973" -> "979";
"961" -> "970";
"973" -> "978";
"966" -> "974";
"967" -> "982";
"969" -> "976";
"960" -> "972";
"970" -> "984";
"972" -> "985";
"971" -> "980";
"966" -> "977";
"980" -> "986";
"967" -> "981";
"970" -> "983";
"985" -> "988";
"980" -> "987";
"985" -> "989";
}

关于c - 如何打印由c中的fork命令创建的进程树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50791249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com