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