1

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

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

4

3 回答 3

2

将程序更改为这种方法:

  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 的启动初始化更改为无缓冲或至少行缓冲。

于 2013-03-10T05:42:55.477 回答
1

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

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

于 2013-03-10T05:46:27.267 回答
1

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

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

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

于 2013-03-10T05:46:54.760 回答