首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同一个文件的fd上有多个fdopen()?

同一个文件的fd上有多个fdopen()?
EN

Stack Overflow用户
提问于 2014-04-17 17:25:57
回答 2查看 530关注 0票数 1

我试图理解标准I/O,我遇到了调用fdopen()的问题。

如果我在相同的文件描述符上调用fdopen()是什么行为,如下所示?为什么我会得到‘377’(-1)的输出?

代码语言:javascript
复制
#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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-17 17:43:43

假设您的stdio缓冲区大小为4K。第一个fgetc将4K读入缓冲区并返回第一个字节。fd现在是先进的4K文件。第二个fgetc就是从那里读取的。您的文件小于缓冲区大小,因此您在EOF。你用%c打印EOF,得到一个有趣的字符。

一个fd上的多个fd获得了的选票--不要尝试;它会伤害到。如果您正在编写stdinstdoutstderr,则可以从一个tty描述符中创建getty

票数 3
EN

Stack Overflow用户

发布于 2014-04-17 17:43:13

多重问题:

  1. char不是存储fgetc返回值的正确类型。使用int
  2. 您正在通过两个不同的句柄访问相同的打开文件描述,而不执行合法地在它们之间切换所需的步骤。这会调用未定义的行为。
  3. 检查errno并从中推断错误是无效的。如果您已经知道有一个错误,errno会告诉您是哪个错误。它不会告诉您是否发生了错误,如果没有,任何非零值都可能已经写入errno
  4. 我们不知道你的文件内容,所以我们不知道你想读什么。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23139615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档