разветвить дочерний процесс внутри цикла while - PullRequest
0 голосов
/ 16 апреля 2020

Я довольно новичок в unix вызовах sys, и недавно я столкнулся с проблемой, когда существует несколько вызовов fork () для дочернего процесса. И я запутался по поводу вывода.

int main() {
    int count = 0;
    int pid;
    if (!(pid = fork())) {

        while ((count < 2) && (pid = fork())) {
            count++;
            printf("Count for pid: %d: %d\n", getpid(), count);
        }
        if (count > 0) {
            printf("Count for pid: %d: %d\n", getpid(), count);
        }
    }
    if (pid) {
        printf("pid is %d, and we waitpid\n", pid);
        waitpid(pid, 0, 0);
        count = count << 1;
        printf("Count for pid: %d: %d\n", getpid(), count);
    }
}

, и вывод, который я получил:

pid is 12933, and we waitpid
Count for pid: 12933: 1
Count for pid: 12933: 2
Count for pid: 12933: 2
pid is 12935, and we waitpid
Count for pid: 12935: 1
Count for pid: 12933: 4
Count for pid: 12932: 0

Так что мой вопрос, как получилось, что есть только 3 уникальных pid, не должны fork в то время как l oop создает больше дочерних процессов, чем 3?

1 Ответ

1 голос
/ 19 апреля 2020

Вам, вероятно, известно о fork возвращаемом значении:

В случае успеха PID дочернего процесса возвращается в родительском, а 0 - в дочернем. В случае ошибки -1 возвращается в родительский, дочерний процесс не создается, и errno устанавливается соответствующим образом.

Итак, ваш код будет проходить через такое дерево:

enter image description here

Я написал порядковый номер для каждой функции printf.

...