Обычно вы используете WNOHANG и WUNTRACED в разных случаях.
Случай 1. Предположим, у вас есть процесс, который порождает кучу дочерних процессов и должен делать другие вещи, пока дочерние процессы выполняются. Эти дочерние процессы иногда завершаются или уничтожаются, но ядро будет удерживать их статус завершения до тех пор, пока какой-либо другой процесс не потребует его с помощью функций wait() или waitpid(). Таким образом, ваш родительский процесс должен время от времени вызывать wait()/waitpid(), чтобы позволить ядру избавиться от остатков дочернего процесса. Но мы не хотим, чтобы функция wait()/waitpid() блокировала, потому что в этом случае у нашего процесса есть другие задачи, которые ему нужно делать. Мы просто хотим получить статус мертвого процесса, если есть. Вот для чего нужен WNOHANG. Он предотвращает блокировку wait()/waitpid(), чтобы ваш процесс мог выполнять другие задачи. Если ребенок умер, его pid будет возвращен функцией wait()/waitpid(), и ваш процесс может действовать в соответствии с этим. Если ничего не умерло, то возвращаемый pid равен 0.
Случай 2. Предположим, что вместо этого ваш родительский процесс хочет ничего не делать, пока выполняются дочерние процессы. Вы не хотите, чтобы он просто выполнял цикл for, поэтому вы используете обычный wait()/waitpid() без WNOHANG. Ваш процесс выводится из очереди выполнения до тех пор, пока один из дочерних процессов не умрет. Но что, если один из ваших дочерних элементов остановлен с помощью SIGSTOP? Ваш ребенок больше не работает над задачей, которую вы ему поставили, но родитель все еще ждет. Таким образом, у вас есть тупик, в некотором смысле, если дочерний процесс не продолжается каким-то образом, внешним по отношению к вашему родителю и этому ребенку. WUNTRACED позволяет вашему родителю быть возвращенным из wait()/waitpid(), если дочерний элемент остановлен, а также вышел или был уничтожен. Таким образом, у вашего родителя есть возможность отправить ему SIGCONT, чтобы продолжить его, убить его, назначить его задачи другому ребенку, что угодно.
person
Jemenake
schedule
18.01.2016
wait(2)
. - person melpomene   schedule 04.11.2015-1
, он не ждет завершения всех дочерних элементов, он ждет завершения любого дочернего элемента. Как только любой ребенок закончил, его пожинают. - person fuz   schedule 04.11.2015