Как дождаться дочернего процесса?

Я делаю обычную комбинацию fork + exec:

int sockets [2];
socketpair (AF_LOCAL, SOCK_STREAM, 0, sockets);
int pid = fork ();

if (pid == 0) {
  // child
  dup2 (sockets[0], STDIN_FILENO);
  dup2 (sockets[0], STDOUT_FILENO);
  execvp (argv[0], argv);
  _exit (123);
}
// parent

close (sockets[0]);
// TODO wait and see if child crashes

Можно ли дождаться, пока ребенок не выйдет из строя или не начнет ждать чтения (...)?


person Łukasz Lew    schedule 18.10.2009    source источник
comment
Почему бы вам не использовать сигналы, как указано в другом потоке (stackoverflow.com/questions/1584956/)?   -  person Alex Ciminian    schedule 19.10.2009
comment
Потому что я не получу SIGCHLD, если ребенок не умрет, а остановится на чтении. (или я?)   -  person Łukasz Lew    schedule 19.10.2009


Ответы (3)


код ожидания проверки

 pid_t waitpid(pid_t pid, int *stat_loc, int options);

от

#include <sys/wait.h>
person Charles Ma    schedule 18.10.2009
comment
это поможет вам выяснить, когда он потерпел крах, но определить, когда он ожидает ввода, сложнее... - person Charles Ma; 19.10.2009

Вы можете использовать системный вызов ptrace(2), чтобы делать то, что делает strace(1). В дочернем процессе перед выполнением вам нужно будет вызвать PTRACE_TRACEME, и это прикрепит к нему родительский процесс в качестве отладчика. Затем родителю придется возобновить выполнение с помощью PTRACE_SYSCALL, и оно будет останавливаться при каждом системном вызове. Родитель должен использовать wait(2) для ожидания до тех пор, пока дочерний процесс не сработает при системном вызове, а затем использовать ptrace с PTRACE_PEEK* для проверки аргументов системного вызова. Повторяйте это до тех пор, пока не будет вызван системный вызов, которого вы ожидаете (чтение), а затем отсоединитесь от дочернего процесса с помощью PTRACE_DETACH. Подробности о том, как распознать интересующий системный вызов, см. в источнике strace. В случае сбоя процесса системный вызов ожидания сообщит вам, что процесс получил SIGSEGV. Не забудьте отсоединиться и в этом случае.

person Alexey Feldgendler    schedule 05.11.2009

Вот предложение:

Откройте канал, дочерний процесс может отправить сообщение по каналу, чтобы сообщить родительскому что он собирается прочитать() на стандартном вводе. Если вы сделаете это правильно и ребенок умрет, я думаю, что родитель будет уведомлен о том, что труба сломана.

person Artelius    schedule 18.10.2009
comment
Ребенок собирается вызвать произвольную команду. У меня нет контроля над его источником. - person Łukasz Lew; 19.10.2009
comment
Тогда я не знаю, есть ли какое-нибудь простое решение. Вы можете запустить дочерний элемент в strace или что-то подобное, чтобы увидеть, какие системные вызовы он использует... - person Artelius; 19.10.2009