Я читал документацию по wait()
и waitpid()
и до сих пор немного не понимаю, как они работают (я понял, что wait(&status)
эквивалентно waitpid(-1, &status, 0);
). Ниже приведены небольшие фрагменты кода, над которым я работаю. Пожалуйста, помогите мне понять, правильно ли написаны эти фрагменты, и если нет, то почему.
Цель 1. Пожинать всех детей-зомби.
int reapedPid;
do {
reapedPid = waitpid(-1,NULL,WNOHANG);
} while (reapedPid > 0);
То, что я пытаюсь сделать здесь, это перебрать всех дочерних элементов, собрать дочерний элемент, если он завершен, позволить ему продолжать работу, если нет, и когда у меня закончатся дочерние элементы, тогда reapedPid == -1
и цикл завершится. Причина, по которой я здесь запутался, заключается в том, что я не понимаю, как waitpid()
должен знать, какие дочерние элементы уже проверены, а какие нет. Делает ли он такую проверку? Или такой подход не сработает?
Цель 2. Подождать, пока закончат все дочерние элементы.
int pid;
do {
pid = wait(NULL);
} while (pid != -1);
Здесь меня не волнует, какой в результате будет статус дочерних элементов - он должен просто ждать завершения каждого дочернего процесса, будь то успешно или неудачно, а затем выйти. Я думаю, что этот код правильный, но я не уверен.
Цель 3. Разветвить дочерний элемент и дождаться его завершения.
int pid = fork();
if (pid < 0) {
// handle error.
}
else if (pid == 0) {
// execute child command
}
else {
int status;
int waitedForPid = waitpid(pid,&status,0);
assert(waitedForPid == pid);
}
Здесь я просто пытаюсь разветвить процесс и заставить родителя дождаться завершения дочернего процесса. Я не совсем уверен, должен ли я передать здесь параметр 0
, но мне показалось, что WNOHANG, WUNTRACED и WCONTINUED не имеют отношения к моей цели.