Получение общего количества процессов из вызова fork() с использованием WEXITSTATUS

Глядя на этот пост, я не понимаю ответ Кайлум. У меня два вопроса.

1) Он / она хочет использовать переменную "count" для подсчета общего числа порожденных процессов (то есть общего числа дочерних внуков и т. Д. + Исходный процесс) из вилки. Я вижу, что он / она начинает с установки счетчика в 1 в родительском процессе, что имеет смысл (для подсчета родителя), но затем он / она снова устанавливает счет в 1 в дочерних процессах. Почему это имеет смысл? Счетчик уже установлен в единицу, и это только устанавливает счет, равный 1 снова.

 count += WEXITSTATUS(status);

2) Я исследовал WEXITSTATUS и из того, что я могу собрать, он возвращает статус выхода процесса через выход. Мой вопрос, должен ли я использовать

exit(0)

или же

exit(1)

или что-то еще, чтобы это работало. Документация для этого не ясна. Другими словами, чтобы он работал как Кейлум

Полный сегмент кода здесь для удобства:

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(void)
{
    pid_t before_pid, after_pid;
    pid_t forked_pid;
    int count;
    int i;
    int status;

    before_pid = getpid();
    count = 1; /* count self */
    for (i = 0; i < 3; i++) {
        forked_pid = fork();

        if (forked_pid > 0) {
            waitpid(forked_pid, &status, 0);
            /* parent process - count child and descendents */
            count += WEXITSTATUS(status); 
    }   else {
        /* Child process - init with self count */
        count = 1;
    }
}

after_pid = getpid();
if (after_pid == before_pid) {
    printf("%d processes created\n", count);
}

return (count);
}

1 ответ

Я вижу, что он / она начинает с установки счетчика в 1 в родительском процессе, что имеет смысл (для подсчета родителя), но затем он / она снова устанавливает счет в 1 в дочерних процессах. Почему это имеет смысл? Счетчик уже установлен в единицу, и это только устанавливает счет, равный 1 снова.

В противном случае каждый дочерний процесс, созданный в цикле, может иметь count значение больше чем 1, Помните fork() дублирует процесс из его текущего состояния. Так что для любого данного fork() в петле, count не обязательно 1. Если вы печатаете значение count в else часть, вы можете легко понять это.

Я исследовал WEXITSTATUS и из того, что я могу собрать, он возвращает состояние выхода процесса через выход. Мой вопрос заключается в том, должен ли я использовать exit(0) или exit(1)?

Это то что return(count) из делает. Возвращение с основного равнозначно звонку exit т.е. exit(count);,

Обратите внимание, что этот ответ проходит счет через exit() статус. Значение состояния выхода исторически ограничено 8-битным значением. Таким образом, он может не работать, как ожидалось, для любого значения i больше 8 на большинстве платформ.

Другие вопросы по тегам