关闭标准输出后打开的文件的POSIX定义的缓冲是什么?

问题描述 投票:1回答:2

说我有以下代码:

close(1);
int fd = open("temp.txt", O_WRONLY | O_CREAT);
if (fork() == 0)
    printf("Message from A\n");
printf("Message from B\n");

[我知道stdout是行缓冲的,并且我已经注意到,至少在我的系统上,这可以按预期运行。

temp.txt的内容是:

Message from B
Message from A
Message from B

但是,POSIX为上述代码定义的行为是什么?是否为文件描述符1保留了行缓冲(即使在close()之后)?它是未定义的吗?还有吗我假设open()命令将始终在上述代码中为temp.txt使用文件描述符1。

[另外,是否有可能在CPU加载其他进程并改写刚刚写入的部分消息之前,仅将"Message from A\n""Message from B\n"的一部分写入与文件描述符1相关联的缓冲区中?

例如

父父进程可能仅在子进程中断之前设法设法将“消息”写入缓冲区,从而在temp.txt中产生以下内容(或类似内容:]]

Message from A
 from B
Message from B

注意:

上面的代码是我为一个班级分配的作业中给我的。我知道最好打开文件然后调用dup2(),而不是关闭文件描述符1,然后再打开文件。

说我有以下代码:close(1); int fd = open(“ temp.txt”,O_WRONLY | O_CREAT); if(fork()== 0)printf(“来自A \ n的消息”); printf(“来自B \ n的消息”);我知道stdout是line -...

c posix file-descriptor multiprocess
2个回答
1
投票

如果标准输出是端子,则它是行缓冲的。如果是文件,则不需要。这取决于平台/实现。在第二个示例程序中,您看不到1000行,因为您要使用_exit终止子进程。


0
投票

POSIX未指定C的缓冲,它由C标准指定。

© www.soinside.com 2019 - 2024. All rights reserved.