0

SIGCHLD を適切に処理しようとしていますが、ハンドラー内のプロセスの PID を取得できないため、構造内の 1 つのパラメーターの値を変更できます。

コードは次のとおりです。

typedef struct
{
    int active_state;
    int pid;
}Worker;

typedef struct
{
    Worker worker;
    int used_state;//this can be USED or UNUSED
}WorkersTable;

WorkersTable *table; //I put this in a shared memory map and works correctly

ハンドラーのコードは次のとおりです。このファイル内には、dead_child_pidという名前のグローバル変数があり、変更に使用する死んだ子の pid を格納したいと考えています。

void handler_SIGCHLD(int signal)
{
    pid_t child_pid;
    int e;
    do
    {
        child_pid=wait3(&e,WNOHANG,NULL);
    }while(child_pid>(pid_t)0);
    mark_unused=1;
}

handler_SIGCHLD が呼び出され、最後に mark_unused=1 を設定すると、次のコードがアクセスされます。

if(mark_unused)
    {
        /*put the current position at the table as unused*/
        int counter_find_pid=0;
        while(counter_find_pid<MAX_WORKERS&&table[contador_find_pid].used_state==USED&&table[counter_find_pid].worker.pid!=dead_child_pid)
        {
            counter_find_pid++;
        }
        table[counter_find_pid].used_state=UNUSED;
    }
4

1 に答える 1

1
void handler_SIGCHLD(int signal)
{
    pid_t child_pid;
    int e;
    do
    {
        child_pid=wait3(&e,WNOHANG,NULL);
    }while(child_pid>(pid_t)0);
    mark_unused=1;
}

有効なwait3戻り値は次のとおりです。

  1. 子供のピッド
  2. 状態を変更していない子がある場合は 0
  3. -1 エラーの場合

child_pidが0 または -1 になるまで、そのループから抜け出すことはありません。この場合、以前の値 (死亡した子 pid の) は上書きされています。ループ内にある間に、死んだ子の有効な pid をどこかに保存する方法を見つけるか、ループを変更する必要があります。グローバルをハンドラーに入れることができますdead_child_pidが、揮発性にすることができます。

編集

これにもっと似たものが必要ですが、これが深刻なアプリケーションである場合は、これも拡張が必要です。これは、死んだ子配列をダウンストリームで処理している間にハンドラーが呼び出される可能性があるためです。次に、操作中に SIGCHLD をブロックすることを検討する必要があります。

// somewhere, probably global scope
volatile currentlyDeadChilren = 0;
volatile pid_t dead_children[MAX_DEAD_CHILDREN];    

void handler_SIGCHLD(int signal)
{
    pid_t child_pid;

    int e;

    do
    {
        child_pid=wait3(&e,WNOHANG,NULL);

        if (child_pid > 0)
            dead_children[currentlyDeadChildren++] = child_pid;        

    }while(child_pid>(pid_t)0);

    mark_unused=1;
}
于 2013-12-06T01:17:10.683 に答える