Как я должен использовать * status в waitpid (pid_t pid, int * status, int options)? - PullRequest
1 голос
/ 04 апреля 2020

Я не понимаю, что должен делать *status или что он делает.

Ниже приведен пример; Не могли бы вы объяснить, что делает stat_cliente?

for(int i = 0; i < Config.CLIENTES; i++){
    int stat_cliente;

    waitpid(Ind.pid_clientes[i], &stat_cliente,0);
    if(WIFEXITED(stat_cliente)){ // Se terminou normalmente WIFEXITED devolve true
        int status = WEXITSTATUS(stat_cliente); // WEXITSTATUS devolve os 8 bits menos

        if(status < Config.SERVICOS){   // significativos do status usado no
                                        // exit do filho

            Ind.servicos_recebidos_por_clientes[status]++;
        }
    }
}

1 Ответ

2 голосов
/ 04 апреля 2020

Как широко описано здесь , waitpid() - это одна из функций, * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. Это в основном используется для правильного завершения дочерних процессов и освобождения их ресурсов.

Нет необходимости повторять полное объяснение страницы руководства. Давайте просто скажем, что в

pid_t waitpid(pid_t pid, int *status, int options); 
  • pid - это идентификатор процесса дочернего процесса, который нужно ждать. Это параметр, отличающий эту функцию от ее «сестер», поскольку она позволяет ожидать процесса Speci c. Ну, это также позволяет ждать групп процессов; Прочтите руководство для дальнейших разъяснений.
  • status . Это указатель на целое число, в котором waitpid() будет хранить новый статус.
  • options определяет поведение функции (что позволяет, например, работать в неблокирующем режиме). Более подробное объяснение см. В руководстве.

О параметре status

Итак, чтобы ответить на ваш вопрос, в чем смысл параметра status ? И почему это указатель на целое число? Передача переменных, таких как указатели, часто является альтернативным способом вывода чего-либо.

Таким образом, эта функция на самом деле имеет два вывода: измененный pid (через возвращаемое значение) и новый статус, записанный в адресе, который вы ему предоставили (если адрес не равен NULL).


Анализ кода

  1. В известном количестве клиентов определено oop в пределах Config.CLIENTES
  2. Программа ожидает изменения статуса каждого клиента, переменная stat_cliente заполняется новым состоянием этого процесса (фактически, его адрес, int * передается waitpid()). Предупреждение : нет проверки на возвращаемое значение waitpid(), которое могло бы фактически вернуть -1 в случае ошибки. В этом случае значение stat_cliente будет бессмысленным!
  3. Программа проверяет, нормально ли завершился дочерний процесс через WIFEXITED() macro
  4. В случае нормального завершения макрос WEXITSTATUS() может вызываться для получения статуса выхода
  5. Для ограниченного подмножества дочерних процессов (полагаемых, поскольку они классифицированы как сервисы, поскольку выполняется проверка по Config.SERVICOS), увеличьте указанный c счетчик найденный статус для текущей службы.

В заключение эта часть программы выполняет две задачи:

  1. Она обеспечивает завершение всех дочерних процессов. изящно через waitpid().
  2. Он обновляет таблицу statisti c для подмножества их, называемых "сервисами", чтобы проследить историю всех возможных причин завершения для каждого из них. .
...