Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用alarm()实现进程超时_C++_Timeout_Fork_Alarm - Fatal编程技术网

C++ 使用alarm()实现进程超时

C++ 使用alarm()实现进程超时,c++,timeout,fork,alarm,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 pi

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

我尝试了以下方法:

#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;
}

我无法在处理程序中执行
kill()。当引发
SIGALRM
时,如何使
wait()
返回?

在您的操作系统版本中,
signal
调用会安装设置了
sau RESTART
标志的处理程序。设置此标志后,系统调用将在信号处理程序之后自动重新启动


要控制这一点,请使用
sigaction
,而不是使用过时和不推荐的
信号,并确保不指定SA_重新启动标志。这应该可以解决您的问题。

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


要控制这一点,请使用
sigaction
,而不是使用过时和不推荐的
信号,并确保不指定SA_重新启动标志。这应该可以解决您的问题。

这不是C代码。这不是C代码。
Child created
Handler called
PID: 31683 FLAG: 1