【问题标题】:How to print a tree of processes that created by a fork command in c如何打印由c中的fork命令创建的进程树
【发布时间】:2018-06-11 05:56:54
【问题描述】:

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

int main(){

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

    while(1);

    return 0;
}

这个命令写在一个 C 文件中。如何打印此代码创建的进程树?

【问题讨论】:

  • 我认为使用诸如forking() 之类的函数,它主要调用fork(),但也会打印相关信息——在fork() 之前或之后,或两者兼有——将是一种合理的方式生成您正在寻找的数据。提出它是一个不同的问题。如果您使用pause() 而不是while (1);,这对您的系统会更好——这允许其他进程继续进行实际工作。由于进程全部挂起,您还可以安排分析来自ps 的输出以获取进程树信息(如果这些进程没有被忙循环占用)。

标签: c process tree fork


【解决方案1】:

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

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

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

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

要收获孩子,请将无限循环替换为示例

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

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 2014-07-27
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多