2

一部のハードウェア センサーを 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 によって中断されることなく、プログラムにこれを実行させるにはどうすればよいでしょうか?

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 に答える