gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:38:03 26 4
gpt4 key购买 nike

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

我尝试了以下方法:

#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() 来杀死 child 。当 SIGALRM 出现时,如何让 wait() 返回?

最佳答案

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

要控制它,不要使用过时和弃用的 signal,而是使用 sigaction,并确保不指定 SA_RESTART 标志。这应该可以解决您的问题。

关于c++ - 使用alarm()实现进程超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50863885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com