1

私はリモート ターミナル アプリケーションを作成しており、パイプを使用して子プロセスの stdout/stderr からデータを取得し、それをクライアントに送信しています。特に、私は Linux を実行しており、移植性についてはあまり気にしていません (ソリューションが Linux のみであれば問題ありません)。

パイプに現在書き込まれているが、まだ読み取られていないバイト数を知る必要があります。私は長い間グーグルをしていましたが、答えが見つかりませんでした。ブロックせずにパイプからできるだけ多くのバイトを読み取る必要があります。

これは可能ですか?ご協力ありがとう御座います。

4

1 に答える 1

0

これを行う唯一の方法は、読み取りを試みて、取得したバイト数をカウントすることです。recvMSG_PEEKそれを行うことができます。

最善の策は、パイプの読み取り側を非ブロッキングに設定してから先読みすることです。ファイル記述子が非ブロックに設定さreadれていて、その上にあり、パイプが空である場合は、EAGAINエラーが発生しerrnoます。これは、パイプがまだ開いているが、現時点では空であることを示します。

ファイル記述子を非ブロックに設定できます

fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_NONBLOCK);

それから読んでください:

while (read(fd, buffer, sizeof(buffer))) {
    if (errno == EAGAIN) {} // buffer currently empty
    else if (errno) {perror("read")} // an error happened
}
于 2013-10-18T14:00:17.947 に答える