1

通常の 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

子がクラッシュするか、読み取りの待機を開始するまで待つことは可能ですか (...)?

4

3 に答える 3

1

チェックアウト waitpid

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

から

#include <sys/wait.h>
于 2009-10-18T22:22:41.950 に答える
1

ptrace(2) システムコールを使用して、strace(1) が行うことを行うことができます。子プロセスでは、実行する前に PTRACE_TRACEME を呼び出す必要があります。これにより、親プロセスがデバッガーとしてそれにアタッチされます。その後、親は PTRACE_SYSCALL で実行を再開する必要があり、syscall ごとに停止します。親は、wait(2) を使用して、子が syscall でトリップするまで待機し、次に ptrace を PTRACE_PEEK* と共に使用して、syscall への引数を調べる必要があります。待っている(読み取り)syscallが呼び出されるまでそれを繰り返し、PTRACE_DETACHで子プロセスから切り離します。対象のシステムコールを認識する方法の詳細については、strace のソースを参照してください。プロセスがクラッシュした場合、wait syscall は、プロセスが SIGSEGV を取得したことを通知します。その場合もデタッチを忘れずに。

于 2009-11-05T23:44:35.883 に答える
0

ここに提案があります:

パイプを開くと、子プロセスはメッセージをパイプに送信して、標準入力で read() を実行しようとしていることを親に伝えることができます。これを正しく行って子供が死んだら、パイプが壊れたことが親に通知されると思います。

于 2009-10-18T21:34:32.923 に答える