使用alarm()实现进程超时

时间:2018-06-14 18:37:24

标签: c++ timeout fork alarm

我正在尝试建立一种机制,在指定的时间内等待子进程,并相应地执行其他操作。

我尝试了以下内容:

#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <iostream>

volatile sig_atomic_t p_flag = false;

pid_t makeproc ()
{
  pid_t pid;

  pid = fork();

  // parent
  if (pid) return pid;

  //child 
  std::cout << "Child created\n";
  sleep(5);
  exit(0);
}

void sig_handle (int sig)
{
  std::cout << "Handler called\n"; 
  p_flag = true;
}

int main() {
  int status;
  pid_t child;
  int ret;

  signal (SIGALRM, sig_handle);
  alarm(2);

  child = makeproc();
  pid_t p = waitpid(-1, &status, 0);
  std::cout << "PID: " << p << " FLAG: " << p_flag;

  return 0;
}

我得到的是waitpid() SIGALRM没有被SIGALRM打断,父母继续等待,直到流程结束。输出显示生成Child created Handler called PID: 31683 FLAG: 1 并调用处理程序。

kill()

我无法在处理程序中执行wait()来杀死孩子。如何在SIGALRM被提升时让mynews/.htaccess返回?

1 个答案:

答案 0 :(得分:1)

最有可能的是,在您的操作系统版本中,signal调用安装处理程序并设置了SA_RESTART标志。设置此标志后,系统调用将在信号处理程序后自动重新启动。

要控制此操作,请使用signal,而不要使用过时且已弃用的sigaction,并确保不指定SA_RESTART标志。这应该可以解决您的问题。