当我在 Linux 系统上运行以下 C 代码时:
printf("This is sentence 1. ");
write(STDOUT_FILENO, "This is sentence 2.\n", 20);
Run Code Online (Sandbox Code Playgroud)
我以错误的顺序得到输出:
This is sentence 2.
This is sentence 1.
Run Code Online (Sandbox Code Playgroud)
据我了解,发生这种情况是因为“printf”将数据发送到用户空间中的缓冲区,并且需要一些时间才能到达内核空间,而“write”立即将数据发送到内核空间中的缓存缓冲区。
解决此问题的一种方法是将数据从用户空间缓冲区刷新到内核空间缓冲区,如下所示:
printf("This is sentence 1. ");
fflush(stdout);
write(STDOUT_FILENO, "This is sentence 2.\n", 20);
Run Code Online (Sandbox Code Playgroud)
然后收到正确的输出:
This is sentence 1. This is sentence 2.
Run Code Online (Sandbox Code Playgroud)
我尝试解决此问题的另一种方法是尝试从 STDOUT_FILENO fd 获取标准输出流:
FILE *file = fdopen(STDOUT_FILENO, "w");
printf("This is sentence 1. ");
fflush(file);
write(STDOUT_FILENO, "This is sentence 2.\n", 20);
Run Code Online (Sandbox Code Playgroud)
但是,我得到的输出顺序错误:
This is sentence 2.
This is sentence 1.
Run Code Online (Sandbox Code Playgroud)
为了确保STDOUT_FILENO是代表stdout的fd,我将stdout转换为fd:
int …Run Code Online (Sandbox Code Playgroud)