【问题标题】:How to wait for process child?如何等待进程子?
【发布时间】:2009-10-18 21:03:34
【问题描述】:

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

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

【问题讨论】:

  • 你为什么不使用其他线程 (stackoverflow.com/questions/1584956/…) 上指出的信号?
  • 因为如果孩子不会死,我不会得到 SIGCHLD,但会在阅读时停止。 (或者我会?)

标签: linux posix exec fork wait


【解决方案1】:

checkout waitpid

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

来自

#include <sys/wait.h>

【讨论】:

  • 它会帮助你确定它何时崩溃,但检测它何时等待输入是比较棘手的......
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这里有一个建议:

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

    【讨论】:

    • 孩子要调用任意命令。我无法控制它的来源。
    • 那我不知道有没有简单的解决办法。您可以在 strace 或类似的地方运行子进程,以查看它使用的系统调用...
    猜你喜欢
    • 1970-01-01
    • 2011-01-15
    • 2021-01-13
    • 2021-07-27
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多