Четох документацията за 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 не са наистина подходящи за моята цел.