0

SIGCHLDが到着したときにジョブのステータスを更新する必要があるため、sig_atomic_tの値が変更されたかどうかを確認するにはどうすればよいですか?コードは次のようになります...

sig_atomic_t child_status;
sig_atomic_t child_pid;  //is this ok?             
void sigHandler(int signum){
      pid_t pid;
      int status;
      while((pid = wait(-1, &status, WNOHANG) > 0){
              child_status = status;
              child_pid = (int)pid;
      }
}
4

1 に答える 1

1

a の大きさがわからないsig_atomic_tので、必ずしも pid や status を格納できるとは限りません。つまり、C 標準では次のように簡単に説明されています。

§7.14 シグナル処理

...

定義されている型は

sig_atomic_t

これは、非同期割り込みが存在する場合でも、アトミック エンティティとしてアクセスできるオブジェクトの (おそらく volatile 修飾された) 整数型です。

POSIX は、AFAICS という余分なものを保証しません。そうは言っても、n ビット マシンでsig_atomic_tは n ビット タイプである可能性は十分にあります (ただし、8088 のような半幅バスを備えたチップは、より制限される可能性があります)。

変数の現在の値を前回の値と比較することで、他の変数と同じように変更されたかどうかがわかります。

int old_status = child_status;
int old_pid    = child_pid;

...busy code...

if (child_status != old_status || child_pid != old_pid)
    ...something changed...
于 2012-05-29T03:40:38.403 に答える