c - shell获取当前时间 - shell输出




当输出重定向到文件时,printf()和system()的结果顺序错误 (2)

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

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

  return 0;
}

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

我觉得应该是相反的方式。 为什么会发生这种情况,我能做些什么,以便“这是一条测试消息”出现在output.txt的顶部?

如果重要的话,我是C的新手并且在命令行中工作。


它与输出缓冲有关。 我设法重现了同样的行为。 强迫冲洗为我做了。

#include <stdio.h>
#include <stdlib.h>

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

  return 0;
}

在添加fflush之前:

$ ./main > foo
$ cat foo
main
main.c
this is a test message.

之后:

$ ./main > foo
$ cat foo
this is a test message.
foo
main
main.c

我怀疑这是因为stdout缓冲区被刷新的顺序,这不一定是确定性的。 父进程可能会生成 ls 进程,并且在返回之前不会刷新自己的stdout。 在进程退出之前,它可能实际上不会刷新stdout。

尝试在printf语句后添加 fflush (stdout) ,看看是否强制输出首先出现。





io-redirection