Пример использования waitpid()?

Я знаю, что waitpid() используется для ожидания завершения процесса, но как его использовать?

Здесь я хочу сделать, создайте двух детей и дождитесь окончания первого ребенка, а затем удалите второго потомка.

//Create two children
pid_t child1;
pid_t child2;
child1 = fork();

//wait for child1 to finish, then kill child2
waitpid() ... child1 {
kill(child2) }

Ответ 1

Синтаксис waitpid():

pid_t waitpid(pid_t pid, int *status, int options);

Значение pid может быть:

  • < -1: Подождите, пока какой-либо дочерний процесс, идентификатор группы процессов которого равен абсолютному значению pid.
  • -1: Подождите, пока какой-либо дочерний процесс.
  • 0: Подождите, пока какой-либо дочерний процесс, идентификатор группы процессов которого совпадает с идентификатором вызывающего процесса.
  • 0: Подождите, пока ребенок, идентификатор процесса которого равен значению pid.

Значение параметров - это ИЛИ, равное нулю или более из следующих констант:

  • WNOHANG: Немедленно возвращайтесь, если ни один ребенок не вышел.
  • WUNTRACED: Также возвратитесь, если ребенок остановился. Статус для отслеживаемых детей, которые остановились, предоставляется, даже если этот параметр не указан.
  • WCONTINUED: Также верните, если остановленный ребенок был возобновлен доставкой SIGCONT.

Для получения дополнительной справки используйте man waitpid.

Ответ 2

Синтаксис

pid_t waitpid(pid_t pid, int *statusPtr, int options);

1. где pid - это процесс дочернего процесса, который он должен ждать.

2.statusPtr - это указатель на местоположение, в котором должна храниться информация о состоянии для процесса завершения.

3. Указывает необязательные действия для функции waitpid. Можно указать любой из следующих флажков параметров или их можно комбинировать с побитовым включением оператора OR:

WNOHANG WUNTRACED WCONTINUED

В случае успеха waitpid возвращает идентификатор процесса завершенного процесса, состояние которого было сообщено. Если не удалось, возвращается -1.

benifits over wait

1.Waitpid может использоваться, когда у вас есть более одного дочернего процесса, и вы хотите дождаться, когда конкретный ребенок выполнит свое выполнение до возобновления родительских функций

2.waitpid поддерживает управление заданиями

3.it поддерживает неблокирование родительского процесса

Ответ 3

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

int main (){
    int pid;
    int status;

    printf("Parent: %d\n", getpid());

    pid = fork();
    if (pid == 0){
        printf("Child %d\n", getpid());
        sleep(2);
        exit(EXIT_SUCCESS);
    }

//Comment from here to...
    //Parent waits process pid (child)
    waitpid(pid, &status, 0);
    //Option is 0 since I check it later

    if (WIFSIGNALED(status)){
        printf("Error\n");
    }
    else if (WEXITSTATUS(status)){
        printf("Exited Normally\n");
    }
//To Here and see the difference
    printf("Parent: %d\n", getpid());

    return 0;
}