Как сделать так, чтобы дети жили после exec-звонка?

0

Есть ли безопасный способ или обычная практика того, как я могу убедиться, что мой с исполняемыми детьми execvp живет в хорошем состоянии?

Например: я разрешаю пользователю моей программы выбирать пользовательский процессор для некоторых данных в программе (скажем, он хочет обработать их с помощью bzip2 -zc -). Я создаю этот процесс с помощью обычных fork(), execvp() и для каждого stdin, stdout и stderr - pipe(), dup2(). Но я не могу повлиять на то, дал ли пользователь правильный командный вызов или что-то, что умрет, потому что какой-то аргумент неверен (например, он может дать мне cat foo но файл foo не существует, и, следовательно, cat выйдет немедленно),

Могу ли я как-то убедиться, что по крайней мере после того, как я выполнил эту команду пользователя, и прежде чем я начну подавать ее с помощью ввода, он находится в хорошем состоянии - ждет моего ввода - и не уже мертв или умирает?

  • 0
    Проверьте, успешна ли ваша запись. Если ребенок на другом конце канала умирает без чтения каких-либо данных, запись не будет выполнена, и вы (обычно) получите SIGPIPE и SIGCHLD.
Теги:
system

2 ответа

3

Вы можете использовать

waitpid(ChildPID, &status, WNOHANG); 

если он возвращает 0 значит, ребенок жив.

0

Отец получит СИГПИП, если трубка, соединяющая его с ребенком, будет закрыта. Если ребенок умирает, все эти трубы закрыты, поэтому отправляется SIGPIPE.

  • 0
    Я полагаю, что родительский процесс получит SIGPIPE только когда попытается write на закрытый канал.
  • 0
    Или когда он пытается читать из такой трубы. Если родитель не делает ни того, ни другого, ему не нужно заботиться о том, работает ли ребенок. По крайней мере, в этом сценарии (пользовательский конвертер).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню