我有一个C程序,可以编译成一个名为myprogram的可执行文件.这是它的主要功能:

int main(int argc, char ** argv) {
  printf("this is a test message.\n");
  system("ls");

  return 0;
}

当我在Linux shell中运行myprogram > output.txt,然后判断输出时.txt,我看到上面列出的ls的输出"这是一条测试消息"

我觉得应该是相反的.为什么会发生这种情况,我该怎么做才能使"这是一条测试消息"出现在输出的顶部.txt?

如果有关系的话,我对C和命令行都是新手.

推荐答案

默认情况下,当连接到终端时,stdout的输出为line-buffered.也就是说,当缓冲区已满或添加换行符时,会刷新缓冲区.

However,如果stdout没有连接到终端,就像您将输出从程序重定向到文件时所发生的那样,那么stdout就变成了fully buffered.这意味着在缓冲区已满或显式刷新(程序退出时发生)时,将刷新并实际写入缓冲区.

这意味着从代码开始的单独进程的输出(如调用system时发生的情况)很可能首先写入,因为该进程结束时,该进程的缓冲区将被刷新,这是在您自己的进程之前.

使用重定向(或管道)时会发生什么情况:

  1. 你的printf次呼叫写入stdout缓冲区.
  2. system函数启动一个新进程,该进程写入自己的缓冲区.
  3. 当外部进程(由您的system调用启动)退出时,将刷新并写入其缓冲区.您自己进程中的缓冲区,不会被触动.
  4. 您自己的进程结束,您的stdout缓冲区被刷新并写入.

要以"正确"(或至少预期)的顺序获得输出,请在调用system之前调用fflush,显式刷新stdout,或在任何输出之前调用setbuf以完全禁用缓冲.

C++相关问答推荐

是否定义了数组指针类型转换为指针类型?""""

增加getaddrinfo返回的IP地址数量

无效指针值在函数调用之间莫名其妙地改变

如何在c++中包装返回空*的函数

将uintptr_t添加到指针是否对称?

Make Node函数.S有什么问题吗?

如何使用指向 struct 数组的指针并访问数组中特定索引处的 struct

如何在C语言中正确打印图形

从uint8_t*转换为char*可接受

如何使用C++在控制台中以彩色打印被阻止的客户端

Tic-tac-toe:从文件加载存储

有没有一种方法可以用C创建保留限定符的函数?

如何对现有的双向循环链表进行排序?

为什么Linux无法映射这个PT_LOAD ELF段?

带有数组指针的 struct 在print_stack()函数中打印随机数

哪个首选包含第三个库S头文件?#INCLUDE;文件名或#INCLUDE<;文件名&>?

为什么程序在打印每个数字之前要等待所有输入?

使用复合文字数组初始化的指针数组

C23 中的 [[reproducible]] 和 [[unsequenced]] 属性是什么?什么时候应该使用它们?

c 中符号表缺少项目