Пример использования 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;
}