如何等待进程子进程?

发布于 2024-08-08 17:50:11 字数 387 浏览 3 评论 0原文

我执行通常的 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

是否可以等到子进程崩溃或开始等待 read(...) ?

I do the usual fork + exec combination:

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

Is it possible to wait until child crashes or begins waiting on read(...)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

动次打次papapa 2024-08-15 17:50:11

结帐 waitpid

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

来自

#include <sys/wait.h>

checkout waitpid

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

from

#include <sys/wait.h>
べ繥欢鉨o。 2024-08-15 17:50:11

您可以使用 ptrace(2) 系统调用执行 strace(1) 的操作。在子进程中,在执行之前,您需要调用 PTRACE_TRACEME,这会将父进程作为调试器附加到它。然后父进程必须使用 PTRACE_SYSCALL 恢复执行,并且它将在每个系统调用处停止。父级应使用 wait(2) 等待子级在系统调用处跳闸,然后使用 ptrace 和 PTRACE_PEEK* 来检查系统调用的参数。重复此操作,直到调用您正在等待(读取)的系统调用,然后使用 PTRACE_DETACH 与子进程分离。有关如何识别感兴趣的系统调用的详细信息,请参阅 strace 的源代码。如果进程崩溃,等待系统调用将告诉您该进程收到了 SIGSEGV。在这种情况下也不要忘记分离。

You can use the ptrace(2) syscall to do what strace(1) does. In the child process, before exec'ing, you'll need to invoke PTRACE_TRACEME, and that will attach the parent process to it as a debugger. The parent will then have to resume execution with PTRACE_SYSCALL, and it will stop at each syscall. The parent should use wait(2) to wait until the child trips at a syscall, then use ptrace with PTRACE_PEEK* to examine the arguments to the syscall. Repeat that until the syscall you're waiting for (read) is invoked, then detach from the child process with PTRACE_DETACH. Look at the source of strace for details on how to recognize the syscall of interest. If the process crashes, the wait syscall will tell you that the process got SIGSEGV. Don't forget to detach in that case, too.

一生独一 2024-08-15 17:50:11

这里有一个建议:

打开一个 管道,子进程可以通过管道发送消息告诉父级它将在标准输入上读取()。我认为,如果您正确执行此操作并且孩子死亡,则父母将收到管道已损坏的通知。

Here's a suggestsion:

Open a pipe, the child process can send a message down the pipe to tell the parent that it is about to read() on stdin. If you do this correctly and the child dies, the parent will be notified that the pipe has been broken, I think.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文