在同一个filedescriptor fd上有多个fdopen()?

时间:2014-04-17 17:25:58

标签: c io

我正在尝试理解标准I / O.我遇到了调用fdopen()的问题。

如果我在同一个文件描述符上调用fdopen(),行为如下?为什么我得到'\ 377'(-1)的输出?

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main()
{

  int fd1, fd2;
  char c;

  FILE *fp1, *fp2;

  fd1 = open("foo.txt", O_RDONLY, 0);
  fp1 = fdopen(fd1, "r");
  fp2 = fdopen(fd1, "r");

  if (fp2 == NULL)
    printf("NULL\n");

  if (errno)
    printf("ERROR\n");

  c = fgetc(fp1);
  c = fgetc(fp2);

  printf("c = %c\n", c);


  exit(0);
}

2 个答案:

答案 0 :(得分:3)

假设您的stdio缓冲区大小为4K。第一个fgetc将4K读入缓冲区并返回第一个字节。 fd现在将4K推进到文件中。第二个fgetc从那里读取。您的文件小于缓冲区大小,因此您处于EOF状态。您使用%c打印EOF并获得一个有趣的角色。

单个fdopen上的多个fd获得投票,请勿尝试;它会伤害我。如果您正在编写stdin,则可以从单个tty描述符创建stdoutstderrgetty

答案 1 :(得分:0)

多个问题:

  1. char不是用于存储fgetc的返回值的正确类型。使用int
  2. 您通过两个不同的句柄访问相同的打开文件描述,而不执行合法切换所需的步骤。这会调用未定义的行为。
  3. 检查errno并从中推断出存在错误无效。如果您已经知道有错误,errno会告诉您哪一个错误。它不会告诉您是否发生了错误,如果没有,则可能已将任何非零值写入errno
  4. 我们不知道您的文件内容,因此我们无法知道您希望阅读的内容。