Я бы распечатал дерево в формате Graphviz DOT в виде ориентированного графа.В вашем случае выходные данные будут выглядеть так:
digraph {
"a" -> "b";
"a" -> "c";
"b" -> "d";
}
, где каждый процесс (кроме начального) печатает одну строку, содержащую ->
: свой собственный PID в кавычках справа и егоPID родителей в кавычках слева.
Первоначальный процесс печатает части digraph {
и }
, но учтите, что каждый процесс должен ждать своих потомков, чтобы была напечатана закрывающая }
прошлой.Вы можете сделать это, сохранив идентификатор процесса перед этой строкой и, после того, как пожнете все дочерние элементы, напечатав закрывающий }
, если этот идентификатор процесса совпадает с исходным идентификатором процесса.
Чтобы пожинать дочерние элементы, замените ваш бесконечныйнапример, цикл
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 aПравильно измененная программа может выводить:
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";
}