2009-10-18 2 views
1

я обычная вилка + 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 

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

+0

Почему вы не используете сигналы, указанные на другой теме (http://stackoverflow.com/questions/1584956/how-to-handle-execvp-errors-after-fork/1584994#1584994)? –

+0

Потому что я не получу SIGCHLD, если ребенок не умрет, а остановится на чтении. (или будет?) –

ответ

0

Вот suggestsion:

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

+0

Ребенок будет вызывать произвольную команду. Я не контролирую его источник. –

+0

Я не знаю, есть ли какое-нибудь простое решение. Вы можете запустить ребенка в 'strace' или что-то подобное, чтобы увидеть, как его используют вызовы системы ... – Artelius

1

checkout waitpid

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

из

#include <sys/wait.h> 
+0

Как это сделать? –

+0

это поможет вам разобраться, когда он разбился, но обнаружить, когда он ждет ввода, сложнее ... –

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^