微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C:stdout挂起linux管道

我在C中编写了一个简单的I / O回显程序来测试更大的真实程序的问题.这里,linux FD重定向不起作用.

回声程序(又名a.out)是:

#include <stdio.h>

int main(int argc, char **argv) {
  char buff[10];
  while (1) {
    if (fgets(buff, 10, stdin) == NULL) break;
    printf("PRINT: %s \n", buff);
  }
}

从Bash,我运行它:

$mkfifo IN OUT
$# this is a method to keep the pipes IN and OUT opened over time
$while :; do read; echo Read: $REPLY >&2; sleep 1; done <OUT >IN &
$a.out >OUT <IN &

$echo xyz >IN

并且没有产生输出:Bash while循环无法从OUT读取.

让我们将这个a.out与cat进行比较,而cat则按预期工作:

$mkfifo IN OUT
$while :; do read; echo Read: $REPLY >&2; sleep 1; done <OUT >IN &
$cat >OUT <IN &

$echo xyz >IN
Read: xyz

最后一行打印在stderr的控制台上.
cat的输出,与a.out不同,能够穿过OUT并在循环时到达Bash,然后将其打印在控制台上.

a.out有什么问题?

解决方法:

尝试在printf(…)之后添加fflush(stdout).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐