Есть ли безопасный способ или обычная практика того, как я могу убедиться, что мой с исполняемыми детьми execvp
живет в хорошем состоянии?
Например: я разрешаю пользователю моей программы выбирать пользовательский процессор для некоторых данных в программе (скажем, он хочет обработать их с помощью bzip2 -zc -
). Я создаю этот процесс с помощью обычных fork()
, execvp()
и для каждого stdin, stdout и stderr - pipe(), dup2()
. Но я не могу повлиять на то, дал ли пользователь правильный командный вызов или что-то, что умрет, потому что какой-то аргумент неверен (например, он может дать мне cat foo
но файл foo не существует, и, следовательно, cat выйдет немедленно),
Могу ли я как-то убедиться, что по крайней мере после того, как я выполнил эту команду пользователя, и прежде чем я начну подавать ее с помощью ввода, он находится в хорошем состоянии - ждет моего ввода - и не уже мертв или умирает?
Вы можете использовать
waitpid(ChildPID, &status, WNOHANG);
если он возвращает 0
значит, ребенок жив.
Отец получит СИГПИП, если трубка, соединяющая его с ребенком, будет закрыта. Если ребенок умирает, все эти трубы закрыты, поэтому отправляется SIGPIPE.
SIGPIPE
только когда попытается write
на закрытый канал.