0

2 つの子プロセスがフォークされた親プロセスがあります。2 つのパイプ (子ごとに 1 つ) を作成しました。パイプごとに、親の書き込み側と子の読み取り側を閉じました。

私が抱えている問題は、親が各子パイプから同時に読み取るようにすることです。私が読み込もうとしている最初のパイプからのみ読み取っているようです。

//PARENT
while(1)
{
    read(fd[0], buffer, sizeof(buffer));
    //print out buffer
    read(fd2[0], buffer2, sizeof(buffer2));
    //print out buffer2
}

印刷されるのは、最初の読み取り呼び出しからの情報だけです。read が他の read をブロックしているようだと結論付けました。私はオンラインで見て、selectで可能な解決策を見つけましたが、パイプでそれを実装する方法を理解できませんでした(どこにも例がないようです)。

select がパイプでどのように機能するかを誰かが説明したり、私の問題に対する他の可能な解決策を教えてくれませんか?

4

1 に答える 1

3

読み取りがブロックされています。これは、read を呼び出すと、要求したバイト数になるか、ストリームが閉じられる (EOF に達する) まで待機することを意味します。

パイプをノンブロッキングにするか (を使用fcntl(fd[0], F_SETFL, O_NONBLOCK);)、スレッドを使用する必要があります。

編集して、Jonathan Leffler のポイントを追加します。

ノンブロッキングを使用する場合は、select()を呼び出すのが最も効率的です。これにより、多くの CPU 時間を無駄にする必要がなくなります (これは、データが存在しない場合に読み取りがすぐに返されるため、ノンブロッキングを有効にした場合に発生することです)。例えば:

int fds[2];
...
fds[0] = fd[0];
fds[1] = fd2[0];

while...
    select(2, &fds, NULL, NULL, NULL);
    read(...);
    read(...);
于 2012-10-01T22:38:42.753 に答える