说我有以下代码:
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 -...
如果标准输出是端子,则它是行缓冲的。如果是文件,则不需要。这取决于平台/实现。在第二个示例程序中,您看不到1000行,因为您要使用_exit
终止子进程。
POSIX未指定C的缓冲,它由C标准指定。