私のアプリケーションでは、アラームが発生したときに、シグナル ハンドラからパイプに整数を書き込みます。私のメインアプリケーションでは、select() を 0 のタイムアウト値で永遠にループします。問題は、シグナル ハンドラーがパイプの書き込み側に正常に書き込みを行うことですが、[NEVER] を選択すると、パイプの読み取り側の読み取り可能性が示されます。したがって、以下の疑似コードでは、select からの戻り値は 0 になります。さらにプレプレックスされているのは、select を削除して単純にブロッキング read() を実行すると、機能することです!!! ハンドラによって書き込まれた整数を読み取ることができます。select は、パイプの読み取り側が読み取り不能であると常に考えているため、常に 0 を返します。
したがって、疑似コードは次のようになります
int x=0;
for(;;)
{
x = select(maxfd, &readfd, NULL, NULL, &dontWait); // dontWait is timeval with tv_sec and tv_usec = 0
if (x == 1)
//check for read descriptor and do something
}