UNIX で select() がどのようにパイプを処理すると想定されているかを理解するのに苦労しています。マニュアルページを何度も読みましたが、与えられた定義を完全には理解していません。
マニュアルページを読むと、select() は、指定されたファイル記述子の 1 つが (私の場合は) ブロックせずにパイプから読み取りを行うまで、システムを待機させるという印象を受けました。
これが私のアウトラインコードの一部です[編集済み]:
int size, size2;
fd_set rfds;
struct timeval tv;
char buffer[100];
char buffer2[100];
int retval;
while(1)
{
FD_ZERO(&rfds);
FD_SET(fd[0], &rfds);
FD_SET(fd2[0], &rfds);
tv.tv_sec = 2;
tv.tv_usec = 0;
retval = select(2, &rfds, NULL, NULL, &tv); //2 seconds before timeout
if(retval == -1)
perror("Select failed.\n");
else if(retval)
{
size = read(fd[0], buffer, sizeof(buffer));
if(size > 0)
printf("Parent received from even: %s\n", buffer);
size2 = read(fd2[READ], buffer2, sizeof(buffer2));
if(size2 > 0)
printf("Parent received from odd: %s\n", buffer2);
}
else
printf("No data written to pipe in 2 last seconds.\n");
}
ここに2本のパイプがあります。2 つの子プロセスがそれぞれのパイプに書き込みを行っており、親は両方を読み込む必要があります。
テストとして、各パイプに小さな文字列を書き込みます。次に、それらを読み込んで、選択によるブロックを防止しようとします。出力される唯一のものは、偶数パイプからの文字列です。まだブロックしているようです。マニュアルページに何かが欠けているように感じて、イライラしています。誰かが私が間違っていることを教えてもらえますか?