Как напечатать дерево процессов, созданных командой fork в c - PullRequest
0 голосов
/ 11 июня 2018

Я создал дерево вилок, объединив команды fork в C. Программа, которая создала дерево:

int main(){

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

    while(1);

    return 0;
}

Эта команда записана в файле C.Как мне распечатать дерево процессов, созданных этим кодом?

1 Ответ

0 голосов
/ 11 июня 2018

Я бы распечатал дерево в формате 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";
}
...