Как широко описано здесь , waitpid()
- это одна из функций, * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. Это в основном используется для правильного завершения дочерних процессов и освобождения их ресурсов.
Нет необходимости повторять полное объяснение страницы руководства. Давайте просто скажем, что в
pid_t waitpid(pid_t pid, int *status, int options);
- pid - это идентификатор процесса дочернего процесса, который нужно ждать. Это параметр, отличающий эту функцию от ее «сестер», поскольку она позволяет ожидать процесса Speci c. Ну, это также позволяет ждать групп процессов; Прочтите руководство для дальнейших разъяснений.
- status . Это указатель на целое число, в котором
waitpid()
будет хранить новый статус. - options определяет поведение функции (что позволяет, например, работать в неблокирующем режиме). Более подробное объяснение см. В руководстве.
О параметре status
Итак, чтобы ответить на ваш вопрос, в чем смысл параметра status ? И почему это указатель на целое число? Передача переменных, таких как указатели, часто является альтернативным способом вывода чего-либо.
Таким образом, эта функция на самом деле имеет два вывода: измененный pid (через возвращаемое значение) и новый статус, записанный в адресе, который вы ему предоставили (если адрес не равен NULL).
Анализ кода
- В известном количестве клиентов определено oop в пределах
Config.CLIENTES
- Программа ожидает изменения статуса каждого клиента, переменная
stat_cliente
заполняется новым состоянием этого процесса (фактически, его адрес, int *
передается waitpid()
). Предупреждение : нет проверки на возвращаемое значение waitpid()
, которое могло бы фактически вернуть -1 в случае ошибки. В этом случае значение stat_cliente
будет бессмысленным! - Программа проверяет, нормально ли завершился дочерний процесс через
WIFEXITED()
macro - В случае нормального завершения макрос
WEXITSTATUS()
может вызываться для получения статуса выхода - Для ограниченного подмножества дочерних процессов (полагаемых, поскольку они классифицированы как сервисы, поскольку выполняется проверка по
Config.SERVICOS
), увеличьте указанный c счетчик найденный статус для текущей службы.
В заключение эта часть программы выполняет две задачи:
- Она обеспечивает завершение всех дочерних процессов. изящно через
waitpid()
. - Он обновляет таблицу statisti c для подмножества их, называемых "сервисами", чтобы проследить историю всех возможных причин завершения для каждого из них. .