是否为明确定义的相同文件描述符创建了两个FILE?

fuz*_*fuz 11 c posix file-descriptor stdio language-lawyer

POSIX指定了一个fdopen函数,它FILE为文件描述符创建一个.POSIX还指定了一个fileno函数,该函数返回a的文件描述符FILE.总之,这两个可以用于创建第二个FILE访问与现有文件相同的底层文件描述符:

FILE *secondfile(FILE *f, const char *mode)
{
    int fd = fileno(f);

    return fd >= 0 ? fdopen(fd, mode) : NULL;
}
Run Code Online (Sandbox Code Playgroud)

这是POSIX下定义明确的操作吗?当我访问同一个文件描述符的原始FILE和第二个时,会发生什么FILE?是否指定了交互?如果有,怎么样?

从历史上看,Unices FILE为您打开的20个文件使用了固定的结构表.调用fdopen()已经与a关联的文件描述符FILE会因此破坏现有文件并产生未定义的行为.我不确定stdioPOSIX是否仍然允许这样的实现,这就是我提出这个问题的原因.

Joh*_*ger 2

POSIX明确允许多个“句柄”同时与相同的底层“打开文件描述”关联,其中句柄可以是文件描述符或流。尽管它没有专门解决通过fdopen()同一文件描述符打开的多个流,但我认为没有理由认为这些流会比与同一打开文件描述关联的任何两个流通常受到更多或不同的要求。

POSIX 定义了如何使用同一打开文件描述上的两个句柄的约束,以避免未定义的行为。与此相关的是,对于作为文件描述符的句柄来说,这些约束确实很少;几乎所有这些都适用于流,并且它们主要围绕与缓冲相关的条件进行组织。例外情况与定位有关。

如果您以与这些约束一致的方式使用流(主要但不完全是通过确保当您切换到使用另一个流时,输出不会在一个流中未写入地缓冲),您可以期望流 I/O 函数按照记录行事。否则,该行为是明确未定义的。