POSIX规定了一个fdopen函数,用于为文件描述符创建FILE
。 POSIX还规定了一个fileno函数,用于返回FILE
的文件描述符。这两个函数可以一起使用,以创建访问现有文件相同底层文件描述符的第二个FILE
。
FILE *secondfile(FILE *f, const char *mode)
{
int fd = fileno(f);
return fd >= 0 ? fdopen(fd, mode) : NULL;
}
在POSIX下,这是一个明确定义的操作吗?当我访问原始FILE
和我为同一文件描述符创建的第二个FILE
时会发生什么?交互是否已指定?如果有,怎么办?
历史上,Unix使用了一个固定的FILE
结构表用于可打开的20个文件。在文件描述符已经与FILE
相关联的情况下调用fdopen()
将破坏现有文件并产生未定义的行为。我不确定此类stdio
实现是否仍然被POSIX允许,这就是我提出这个问题的原因。
FILE
结构中的数据与底层文件描述符的(共享)偏移量的交互。 - Andrew Henlefileno
的结果称为“文件描述符”,但它更像是一个句柄。但是,由于FILE
结构体可能包括libc的缓冲等内容,如果您使用两个不同的FILE
来处理相同的句柄,则可能会出现问题。该句柄可能更适用于通过直接系统调用进行低级别访问,绕过stdlib函数。无论如何,不清楚您实际上为什么要这样做。如果您需要对文件进行多个访问位置,则最好将它们映射到内存中或在stdlib之上编写自己的层。 - too honest for this site