3

パイプの読み取り端からのものをfread()で読み取る必要があります。

しかし、パイプに何もないときにfread()がEOFを設定することを期待していますが、代わりにエラーインジケーターを設定します。posixとCの標準を確認しましたが、手がかりは見つかりませんでした。おそらく私は意図しないことをしている(読んで、ばかげている)、そうです:)

抜粋は次のとおりです。

#include <stdio.h>
#include <fcntl.h>

int main()
{
   char buf[128];
   FILE *f;
   int pipe_fd[2], n;

   pipe(pipe_fd);
   fcntl(pipe_fd[0], F_SETFL, O_NONBLOCK);

   f=fdopen(pipe_fd[0], "r");
   n=fread(buf, 1, 1, f);
   printf("read: %d, Error: %d, EOF: %d\n", n, ferror(f), feof(f));

   return 0;
}
4

1 に答える 1

8

ノンブロッキングパイプを使用しているので、次のようになると思います。

  • errno==EAGAIN読むべきものが何もない場合(今は何も意味しませんが、後で何かを意味します-後で(e)もう一度試してください)。
  • EOFパイプの書き込み側が閉じているとき(つまり、これ以上データが来ていないとき)。

read()O_NONBLOCKモードが設定されている場合のread()の動作について は、マンページを参照してください。fread()動作はread()と一致している必要があります。

于 2010-12-07T14:08:29.050 に答える