【问题标题】:in c system() executes before printf() even when printf come first [duplicate]在 c 中,system() 在 printf() 之前执行,即使 printf 先出现 [重复]
【发布时间】:2019-03-22 14:00:49
【问题描述】:

我刚开始在c中使用system()函数,我想用system函数从它内部启动同一个可执行文件,所以我写了下面的程序

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

int main()
{
    printf("some string");
    system("./a.out");
}

-我用gcc编译的-

当我运行程序时它没有打印任何东西,它一直在运行,直到我使用快捷键 ctrl-c 停止执行,然后它开始打印输出(直到我停止它才打印任何东西)

我认为语句应该按顺序执行,为什么直到我停止它才打印任何东西?

【问题讨论】:

  • system 在后台使用forkprintf 的输出被缓冲并且可以在任何时候被刷新——在执行子进程之前或之后。如果订单很重要,请通过添加\n 或使用fflush(stdout) 来明确刷新它..
  • 输出流被缓冲,所以在刷新流或进程退出之前,您打印的文本可能不会出现。
  • 解释一下。

标签: c linux gcc


【解决方案1】:

默认情况下,当stdout连接到终端时,它是行缓冲的。

printf("some string");

里面没有'\n',你也没有在它之后调用fflush(stdout);,所以printf("some string");所做的只是将"some string"复制到stdout的输出缓冲区中。

缓冲区在main 结束时被刷新。

printf("some string\n"); 将立即刷新缓冲区,前提是 stdout 已连接到终端并且您没有更改 stdout 的缓冲。

printf("some string"); fflush(stdout); 将立即刷新缓冲区,无论上下文如何,并且不需要'\n'

【讨论】:

  • 我认为解释为什么使用system而不是其他一些函数会发生输出重新排序很重要。
猜你喜欢
  • 2012-07-19
  • 2020-10-05
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 2016-05-30
相关资源
最近更新 更多