gpt4 book ai didi

c - sleep 通过 SIGCHLD

转载 作者:行者123 更新时间:2023-12-04 05:29:39 25 4
gpt4 key购买 nike

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

我遇到的问题是来自 child 的 SIGCHLD 中断了 sleep (60),导致创建了无限的 child ​​,而不是每分钟一个。

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

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 打断的情况下做到这一点呢?

最佳答案

您可以忽略子信号

signal(SIGCHLD, SIG_IGN);

这将停止中断,但您需要小心等待所有 child 。通常是一个循环来捕获它们。
while(waitpid(-1, &status, WNOHANG) > 0);

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

关于c - sleep 通过 SIGCHLD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12782303/

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