孩子在等另一个孩子

时间:2011-04-29 09:31:53

标签: c++ c fork

是否有分叉子项检查另一个分叉子项的方法,这样,如果另一个分叉子项比平时花费更多时间来执行其家务,第一个孩子可能会执行预定义步骤? 如果是这样,我们将非常感谢示例代码。

4 个答案:

答案 0 :(得分:1)

是。只需将要监视的进程分叉,从进程中进行观察

if (fork() == 0) {
    // we are the watcher
    pid_t watchee_pid = fork();
    if (watchee_pid != 0) {
        // wait and/or handle timeout
        int status;
        waitpid(watchee_pid, &status, WNOHANG);
    } else {
        // we're being watched. do stuff
    }
} else {
    // original process
}

强调:有3个过程。原始,观察者进程(处理超时等)和实际观察过程。

答案 1 :(得分:0)

要做到这一点,你需要使用某种形式的IPC,并且命名共享内存段在这里非常有意义。您的第一个孩子可以读取另一个孩子完成其工作后将设置的命名片段中的值。您的第一个孩子可以设置超时,一旦超时,检查值 - 如果未设置值,则执行您需要执行的操作。

代码可能因C或C ++而有很大差异,您需要选择哪个。如果是C ++,你可以使用boost::interprocess - 这里有很多共享内存使用的例子。如果是C,那么你必须使用操作系统的本机调用将它们组合在一起 - 这应该是相当简单的 - 从shmget()开始

答案 2 :(得分:0)

这是一些可以帮助您在Linux环境中解决问题的定向代码。

  pid_t pid = fork();

  if (pid == -1) {
    printf("fork: %s", strerror(errno));
    exit(1);
  } else if (pid > 0) {
    /* parent process */
    int i = 0;
    int secs = 60; /* 60 secs for the process to finish */
    while(1) {
        /* check if process with pid exists */
        if (exist(pid) && i > secs) {
          /* do something accordingly */
        }
        sleep(1);
        i++;
    }
  } else {
    /* child process */
    /* child logic here */
    exit(0);
  }

......那60秒不是很严格。如果你想要更严格的定时测量,你可以更好地使用定时器。但是如果你的系统不需要关键的实时处理应该就是这样。

exist(pid)指的是一个函数,您应该拥有查看proc/pid的代码,其中pid是子进程的进程ID。

或者,您可以使用其他库来实现函数exist(pid),这些库旨在从/proc目录中提取信息,如procps

答案 3 :(得分:0)

您可以wait进行的唯一流程是您自己的直接子流程 - 而不是兄弟姐妹,而不是您的父母,而不是孙子等。根据您的计划需求,Matt的解决方案可能工作为了你。如果没有,这里有一些其他选择:

  • 忘记等待并使用其他形式的IPC。为了获得稳健性,它需要在您等待的过程中意外终止导致您接收事件。我能想到的最好的一个是打开一个pipe,两个进程共享,并将管道的写入结束给你想要等待的进程(确保没有其他进程保持写入结束!)。当保持写入结束的进程终止时,它将被关闭,然后读取结束将指示EOFread将阻塞它,直到写入结束关闭,然后返回零长度读取)。

  • 忘记IPC并使用线程。线程的一个优点是保留了“进程”的原子性。单个线程不可能被杀死或以其他方式在程序控制之外终止,因此您不必担心系统全局命名空间中的进程ID和共享资源分配的竞争条件(IPC对象,文件名,套接字)等)。所有同步原语都完全存在于进程的地址空间中。