是否为定义明确的同一文件描述符创建两个文件?
Is creating two FILEs for the same file descriptor well-defined?
POSIX 指定一个 fdopen function that creates a FILE
for a file descriptor. POSIX also specifies a fileno 函数,该函数 returns FILE
的文件描述符。这两个可以一起用于创建第二个 FILE
访问与现有文件相同的底层文件描述符:
FILE *secondfile(FILE *f, const char *mode)
{
int fd = fileno(f);
return fd >= 0 ? fdopen(fd, mode) : NULL;
}
这是POSIX下定义明确的操作吗?当我访问我为同一个文件描述符创建的原始 FILE
和第二个 FILE
时会发生什么?是否指定交互?如果是,如何?
从历史上看,Unices 为您可以打开的 20 个文件使用固定的 table 的 FILE
结构。在已经与 FILE
相关联的文件描述符上调用 fdopen()
会破坏现有文件并产生未定义的行为。我不确定 POSIX 是否仍然允许 stdio
的这种实现,这就是我问这个问题的原因。
给定一个典型的 Unix 实现,它有一个 FILE 数据结构,其中包含要读取的文件描述符和一个缓冲区,呃,缓冲,如果你知道缓冲区的大小,以及填充它的策略 (当需要数据时,而不是当缓冲区为空时立即),我会说你可以确定会发生什么。但是我不知道POSIX标准是怎么说的,而且我做知道在程序中使用它会是一件很困难的事情。 ("Ok, so I've read the first 4096 bytes from the file on disk into this FILE, and the next 4096 bytes into that FILE, and the third 4096-byte chunk from the file will be read into the FILE that reaches the end of its buffer first and needs to read more...")
(我从来没有故意做过这样的事情,但我似乎记得调试代码时出现的此类症状,这些代码混淆了 FILE 和文件描述符。)
我的 猜测 是 POSIX 没有详细说明它可以保证工作。例如,POSIX 是否指定何时通过读取文件描述符来填充 FILE 内的缓冲区?当为空时,当空 和 时需要更多数据,或者其中任何一个,具体取决于什么?根据那里的选择,文件描述符中的数据将显示在不同的文件中。
POSIX explicitly permits 多个 "handles" 同时与相同的基础 "open file description" 相关联,其中句柄可以是文件描述符或流。尽管它没有专门解决通过同一文件描述符上的 fdopen()
打开的多个流,但我认为没有理由假设这些流会比与同一打开文件描述关联的任何两个流通常受到更多或不同的要求
POSIX 定义了 constraints on how two handles on the same open file description may be used 以避免未定义的行为。与这里相关的是,对于作为文件描述符的句柄,这些约束确实很少;几乎所有这些都适用于流,并且它们主要围绕与缓冲相关的条件进行组织。异常与定位有关。
如果您以符合这些限制的方式使用您的流——主要是但不完全是,通过确保当您切换到使用另一个流时输出不会被未写入地缓冲在一个流中——您可以期望流I/O 函数的行为与记录的一样。否则,行为是明确未定义的。
POSIX 指定一个 fdopen function that creates a FILE
for a file descriptor. POSIX also specifies a fileno 函数,该函数 returns FILE
的文件描述符。这两个可以一起用于创建第二个 FILE
访问与现有文件相同的底层文件描述符:
FILE *secondfile(FILE *f, const char *mode)
{
int fd = fileno(f);
return fd >= 0 ? fdopen(fd, mode) : NULL;
}
这是POSIX下定义明确的操作吗?当我访问我为同一个文件描述符创建的原始 FILE
和第二个 FILE
时会发生什么?是否指定交互?如果是,如何?
从历史上看,Unices 为您可以打开的 20 个文件使用固定的 table 的 FILE
结构。在已经与 FILE
相关联的文件描述符上调用 fdopen()
会破坏现有文件并产生未定义的行为。我不确定 POSIX 是否仍然允许 stdio
的这种实现,这就是我问这个问题的原因。
给定一个典型的 Unix 实现,它有一个 FILE 数据结构,其中包含要读取的文件描述符和一个缓冲区,呃,缓冲,如果你知道缓冲区的大小,以及填充它的策略 (当需要数据时,而不是当缓冲区为空时立即),我会说你可以确定会发生什么。但是我不知道POSIX标准是怎么说的,而且我做知道在程序中使用它会是一件很困难的事情。 ("Ok, so I've read the first 4096 bytes from the file on disk into this FILE, and the next 4096 bytes into that FILE, and the third 4096-byte chunk from the file will be read into the FILE that reaches the end of its buffer first and needs to read more...")
(我从来没有故意做过这样的事情,但我似乎记得调试代码时出现的此类症状,这些代码混淆了 FILE 和文件描述符。)
我的 猜测 是 POSIX 没有详细说明它可以保证工作。例如,POSIX 是否指定何时通过读取文件描述符来填充 FILE 内的缓冲区?当为空时,当空 和 时需要更多数据,或者其中任何一个,具体取决于什么?根据那里的选择,文件描述符中的数据将显示在不同的文件中。
POSIX explicitly permits 多个 "handles" 同时与相同的基础 "open file description" 相关联,其中句柄可以是文件描述符或流。尽管它没有专门解决通过同一文件描述符上的 fdopen()
打开的多个流,但我认为没有理由假设这些流会比与同一打开文件描述关联的任何两个流通常受到更多或不同的要求
POSIX 定义了 constraints on how two handles on the same open file description may be used 以避免未定义的行为。与这里相关的是,对于作为文件描述符的句柄,这些约束确实很少;几乎所有这些都适用于流,并且它们主要围绕与缓冲相关的条件进行组织。异常与定位有关。
如果您以符合这些限制的方式使用您的流——主要是但不完全是,通过确保当您切换到使用另一个流时输出不会被未写入地缓冲在一个流中——您可以期望流I/O 函数的行为与记录的一样。否则,行为是明确未定义的。