2

我有一个 C 程序,它每分钟轮询一次硬件传感器,并将读数添加到数据库中。为了确保读数接近于每分钟(而不是每分钟 + 开销时间),程序会创建一个孩子来完成实际工作,然后在创建另一个孩子之前休眠 60 秒。

我遇到的麻烦是孩子们的 SIGCHLD 正在中断睡眠(60),导致创建无限的孩子​​,而不是每分钟一个。

这就是我一直在尝试的方式:

while(1)
{

    /* Create a child to do the work */
    if((pid = fork()) < 0)
    {
        perror("fork");
        exit(1);
    }
    else if(pid > 0)
    {
        /*parent continues*/
        select(0, 0, NULL, NULL, &time);
        claim_children();
        continue;
    }
    /*Now in the child*/
    process_pvs();
}

我还听说 select() 可用于通过执行以下操作来实现我所追求的目标:

struct timeval time;

time.tv_sec = 60;
time.tv_usec = 0;

select(0, 0, 0, 0, time);

但由于某种原因,这只适用于 while 循环中的 1 次迭代。之后,该程序根本不等待,并不断创建孩子。

那么我怎样才能最好地让我的程序做到这一点而不会被 sigchld 打断呢?

4

2 回答 2

2

您可以简单地围绕它编写代码;检测中断的系统调用,记下时间,并使用逻辑来确定是否需要重新进入睡眠状态,如果需要,需要多长时间。

于 2012-10-08T13:05:43.907 回答
1

您可以忽略子信号

signal(SIGCHLD, SIG_IGN);

这将停止中断,但您需要小心等待所有孩子。通常是一个循环来捕获它们。

while(waitpid(-1, &status, WNOHANG) > 0);

当然,这只有在您没有在其他地方创建其他子进程时才有效。

于 2012-10-08T13:08:35.880 回答