Получение общего количества процессов из вызова 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 на большинстве платформ.