c-重定向操作将订单的输出写入文件



我有一个简单的C文件,它使用printfwrite(1,..)函数写入标准输出。

文件:main.c

#include<stdio.h>
#include<unistd.h>
int main()
{
printf("Hellon");
printf("Marsn");
fsync(1);
write(1,"Olan",4);
write(1,"Earthn",6);
}
> gcc main.c -o test

当我将输出重定向到一个文件时,我看到的顺序与终端中的输出不同。似乎,当我使用重定向write(..)printf(..)更早写入时,即使很难,printf()在代码中也更早,并且中间有一个fsync(..)

是否有重定向运算符的某些变体可以确保秩序,或者我做错了什么。

终端输出

> ./test
Hello
Mars
Ola
Earth

out文件中的输出

> ./test >out
# or ./test|tee out
> cat out
Ola
Earth
Hello
Mars

printf写入C流stdout,该流由C标准库例程缓冲,最终写入Unix文件描述符1。

CCD_ 10和CCD_。fsync从文件描述符1中刷新数据,但它对C标准库的流的缓冲区没有影响。

C标准库I/O例程的操作方式不同,这取决于标准输出是去往终端还是去往文件。这是在程序启动期间检测到的。当输出被发送到终端时,将其发送给用户是很重要的,并且当n被写入流时,缓冲区被刷新。这被称为行缓冲,并且到终端的输出默认设置为行缓冲。

当输出进入一个文件时,及时刷新它并不重要,因为用户不会马上看到它,如果输出被完全缓冲,性能会更好。因此,只有当缓冲区已满、流已关闭或发出显式刷新请求时,才会刷新缓冲区。这被称为完全缓冲,默认情况下,对文件的输出设置为完全缓冲。

这通常在C 2018 7.21.3中进行了说明,其中第7段称:

…当且仅当可以确定流不引用交互式设备时,标准输入流和标准输出流被完全缓冲。

(当输出是终端时,C实现也可以使用无缓冲模式,而不是

行缓冲您可以显式请求用fflush(stdout)刷新stdout

打开stdout后,在对其执行任何其他操作之前,可以使用setvbuf(stdout, NULL, mode, 0)更改其缓冲方法,其中mode分别为_IOFBF_IOLBF_IONBF,表示满缓冲、行缓冲或无缓冲。(您也可以传递一个char数组及其大小来代替NULL0,库将使用该数组作为缓冲区,之后您不应将该数组用于任何其他目的。如果传递NULL和大小,库可以使用该大小来执行自己的缓冲区分配,但这并不能保证。)CCD_ 26返回一个CCD_。

查看一下dup2系统调用:https://www.geeksforgeeks.org/dup-dup2-linux-system-call/

您可以将stdoutput/input重定向到文件

最新更新