Остерегайтесь назначения вместо сравнения.
Остерегайтесь неудачного выполнения команды - exit(1);
после execvp()
.
Я думаю, я бы использовал:
if (andOp == 0)
{
int status;
int corpse = wait(&status);
printf("Child %d exited with status 0x%04X\n", corpse, status);
}
То есть, я бы только подождал, если бы отсутствовал '&'.
Однако, когда фоновые дети умирают случайным образом, вам нужно отслеживать фоновые процессы, и, в частности, вам нужно выполнить циклна wait()
до тех пор, пока ребенок, которого вы только что разбудили, не умрет.Поэтому вам также нужно отловить этот PID из fork()
.
. Возможно, вы захотите получить фантазию и использовать waitpid()
после сбора ожидаемого ребенка, чтобы очистить любые другие тела, используя-блокирующий параметр, чтобы, если таких детей не было, он сразу возвращается.Вы по-прежнему будете использовать его в цикле, так что, если все 6 фоновых заданий завершены, вы соберете их все.
В качестве альтернативы, вы можете рассмотреть возможность игнорирования сигналов «смерти ребенка» (SIGCHLD) - и позволитьсистема позаботится о них.Однако оболочка обычно сообщает о завершении одного из фоновых заданий.