【问题标题】:Redirect stdout to fifo immediately立即将 stdout 重定向到 fifo
【发布时间】:2013-03-10 05:26:58
【问题描述】:

例如,我有一个 c 程序,它打印三行,相隔两秒,即:

  printf("Wait 2 seconds...\n");
  sleep(2);
  printf("Two more\n");
  sleep(2);
  printf("Quitting in 2 seconds...\n");
  sleep(2);

我执行程序并将其重定向到管道:

./printer > myPipe

在另一个终端上

cat < myPipe

6 秒后,第二个终端立即打印!我希望它立即打印可用的行。我该怎么做?

Obs:我无法更改源代码。它实际上是棋盘游戏算法的输出,我必须立即得到它,以便我可以将其插入另一个算法,得到答案并插入第一个算法......

【问题讨论】:

标签: linux bash pipe fifo


【解决方案1】:

把程序改成这种方式:

  printf("Wait 2 seconds...\n");
  fflush (stdout);
  sleep(2);
  printf("Two more\n");
  fflush (stdout);
  sleep(2);
  printf("Quitting in 2 seconds...\n");
  fflush (stdout);
  sleep(2);

补充:

如果你不能改变程序,真的没有办法在不修改程序的情况下影响程序的内置缓冲。

如果您可以重新链接程序,您可以替换一个 printf() 函数,该函数在每次调用后刷新。或者将 stdout 的启动初始化更改为无缓冲或至少行缓冲。

【讨论】:

  • @anishsane,不,这是我的问题。仅当标准输出在终端上时。在我的情况下,它被重定向到管道,它没有。
【解决方案2】:

如果您无法更改来源,您可能想尝试一些解决此相关问题的方法: bash: force exec'd process to have unbuffered stdout

基本上,你必须让操作系统交互地执行这个程序。

【讨论】:

    【解决方案3】:

    我假设实际的源文件是完整的。如果是这样,那么您必须编译源代码并运行它以使其执行任何操作。使用cat 只会打印文件的内容,不会运行它。

    如果它是用 bash 编写的,则必须将其设置为模式位 +x,然后才能使其可执行。允许您从终端运行它 ./script

    无需担心语法,因为您已声明不能更改它并且...它是用 C 正确编写的。

    【讨论】:

      猜你喜欢
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 2012-08-07
      • 2017-03-08
      • 1970-01-01
      • 2011-12-06
      • 2022-11-18
      相关资源
      最近更新 更多