如果达到超时,尝试使用Alarm()唤醒父进程

时间:2015-02-15 21:50:54

标签: c process

我正在用C编写一个与流程相关的程序,我在唤醒流程时遇到了一个小问题:

我有一个父进程,我使用waitpid()进入睡眠状态,但我需要它在子进程完成时或者到达某个时间时进行。我的计划是调用警报(超时),然后调用waitpid(-1,& status,0),所以基本上这个过程会等到孩子完成,如果孩子在超时时间内没有完成,信号会被发送后,父母将在杀死孩子后退出。我遇到的问题是这个alarm()调用只是打印到控制台的“闹钟”,它似乎并没有及时唤醒父母。谢谢!

1 个答案:

答案 0 :(得分:1)

您需要为SIGALRM安装信号处理程序。 alarm()在信号到期时发送SIGALRM信号,如果你不处理该信号,它将终止你的过程。

static int g_timeout;
void alrm_handler(int signo)
{
    g_timeout = 1;
}

在您的主要代码中,例如:

signal(SIGALRM, alrm_handler);
alarm(10);
pid_t p = waitpid(-1,&status,0);
if (p == -1) {
    if (errno == EINTR && g_timeout) {
        //timeout occured
     } else {
       //other error 
     }
 }