c - standard input shell




當輸出重定向到文件時,printf()和system()的結果順序錯誤 (2)

它與輸出緩衝有關。 我設法重現了同樣的行為。 強迫沖洗為我做了。

#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

我有一個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的新手並且在命令行中工作。


我懷疑這是因為stdout緩衝區被刷新的順序,這不一定是確定性的。 父進程可能會生成 ls 進程,並且在返回之前不會刷新自己的stdout。 在進程退出之前,它可能實際上不會刷新stdout。

嘗試在printf語句後添加 fflush (stdout) ,看看是否強制輸出首先出現。





io-redirection