waitpid, wnohang, wuntraced. Как их использовать

Я немного запутался. Как я понимаю, waitpid с pid -1 означает, что я жду завершения всех дочерних, но если я добавлю опцию в waitpid WNOHANG, эти опции говорят, чтобы выйти немедленно, если никто не закончил...Это кажется чрезвычайно запутанным.

Почему я должен сказать компьютеру ждать завершения дочерних процессов, а затем сразу же после этого сказать ему немедленно выйти, если ни один из детей не закончил?

может кто-нибудь объяснить этот вариант и вариантов WUNTRACED? Я не знаю, что значит быть прослежены.

2 ответов


если вы передадите -1 и WNOHANG, waitpid() проверит, существуют ли дети-зомби. Если да, то один из них пожинается и возвращается статус выхода. Если нет, то тоже!--3--> возвращается (если unterminated дети существуют) или -1 возвращается (если нет) и ERRNO установлено значение ECHILD (нет дочерних процессов). Это полезно, если вы хотите узнать, умер ли кто-либо из ваших детей недавно, не дожидаясь смерти одного из них. Это очень полезно в этом отношении.

опции WUNTRACED описанное как ниже, мне нечего добавить к этому описание:

WUNTRACED состояние любых дочерних процессов, указанных pid, которые остановлены, и о состоянии которых еще не сообщалось с момента их остановки, также сообщается запрашивающему процессу.

читать С помощью waitpid страницы POSIX для получения более подробной информации.


вы обычно используете WNOHANG и WUNTRACED в разных случаях.

Случай 1: Предположим, у вас есть процесс, который порождает кучу детей и должен делать другие вещи, пока дети работают. Эти дети иногда выходят или убиваются, но ядро будет удерживать их статус выхода, пока какой-то другой процесс не потребует его через wait() или waitpid(). Таким образом, ваш родительский процесс должен вызывать wait()/waitpid() время от времени, чтобы позволить ядру избавиться от остатков ребенка. Но мы не хотим wait ()/waitpid () to блок, потому что в этом случае у нашего процесса есть другие вещи, которые ему нужно сделать. Мы просто хотим получить статус мертвого процесса Если есть. Для этого и существует WNOHANG. Это предотвращает блокировку wait () / waitpid (), чтобы ваш процесс мог продолжать выполнять другие задачи. Если ребенок умер, его pid будет возвращен wait()/waitpid (), и ваш процесс может действовать на этом. Если ничего не умерло, то возвращенный pid 0.

случай 2: Предположим, что ваш родительский процесс, вместо этого, хочет сделать ничего пока дети работают. Вы не хотите, чтобы он просто делал поворот большого пальца для цикла, поэтому вы используете обычный wait () / waitpid () без WNOHANG. Ваш процесс выводится из очереди выполнения до тех пор, пока один из детей не умрет. Но что, если один из ваших детей остановил через SIGSTOP? Ваш ребенок больше не работает над заданной задачей, но родитель по-прежнему ожидание. Таким образом, у вас есть тупик, в некотором смысле, если ребенок не продолжается каким-то внешним образом для вашего родителя и этого ребенка. WUNTRACED позволяет вашему родителю быть возвращенным из wait () / waitpid (), если ребенок получает остановил а также выход или быть убитым. Таким образом, у вашего родителя есть шанс отправить ему SIGCONT, чтобы продолжить его, убить его, назначить его задачи другому ребенку, что угодно.