我试图理解标准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);
}发布于 2014-04-17 17:43:43
假设您的stdio缓冲区大小为4K。第一个fgetc将4K读入缓冲区并返回第一个字节。fd现在是先进的4K文件。第二个fgetc就是从那里读取的。您的文件小于缓冲区大小,因此您在EOF。你用%c打印EOF,得到一个有趣的字符。
一个fd上的多个fd获得了的选票--不要尝试;它会伤害到。如果您正在编写stdin、stdout和stderr,则可以从一个tty描述符中创建getty。
发布于 2014-04-17 17:43:13
多重问题:
char不是存储fgetc返回值的正确类型。使用int。errno并从中推断错误是无效的。如果您已经知道有一个错误,errno会告诉您是哪个错误。它不会告诉您是否发生了错误,如果没有,任何非零值都可能已经写入errno。https://stackoverflow.com/questions/23139615
复制相似问题