一部のハードウェア センサーを 1 分に 1 回ポーリングし、読み取り値をデータベースに追加する C プログラムがあります。読み取り値が (分単位 + オーバーヘッド時間ではなく) 分単位に近づくようにするために、プログラムは実際の作業を行う子を作成し、別の子を作成する前に 60 秒間スリープします。
私が抱えている問題は、子からの SIGCHLD がスリープ (60) を中断し、1 分ごとに 1 つではなく、無制限の子が作成されることです。
これは私がそれをやろうとしてきた方法です:
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 によって中断されることなく、プログラムにこれを実行させるにはどうすればよいでしょうか?