2

私のアプリケーションでは、アラームが発生したときに、シグナル ハンドラからパイプに整数を書き込みます。私のメインアプリケーションでは、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
}
4

2 に答える 2

6

このselect関数は、セットとタイムアウトの両方を変更します。呼び出しの前に、記述子セットを再初期化し、ループの各反復をタイムアウトにする必要がありselectます。

また、実際には を使用するのではなく、 を使用する必要if (x == 1)がありif (FD_ISSET(some_fd, &readfd))ます。maxfdそして、それは任意のセットで使用される最大のファイル記述子に 1 を加えたものでなければならないことを覚えておいてください。

于 2012-12-10T06:52:22.813 に答える
1

selectsで動作しfd_setます。記述子 (int) へのポインターを渡して選択しようとしているように見えますか?

selectおよびのマニュアルページを参照することをお勧めしますfd_set

http://linux.die.net/man/3/fd_set

于 2012-12-10T06:53:22.060 に答える