【问题标题】:'cut' output redirect to c++ program'cut' 输出重定向到 C++ 程序
【发布时间】:2020-04-17 12:15:08
【问题描述】:

我正在尝试使用cut 更改命令ping 的输出以为我获取一些必要的信息,然后将其重定向到带有bash 管道的c++ 程序。

ping google.com | cut -d " " --fields 8 | ./a.out

C++ 程序做这样的事情:

int main(){
    string str;
    cin >> str;
    cout << "str:" << str << endl;
}

我建议,这样的命令可能有效,但它没有,执行上述命令后没有任何输出。但不使用cut 也能很好地工作。如果我只使用

ping google.com | ./a.out

我的程序确实有输出。所以我认为问题是我的 c++ 程序无法从cut 读取字符串。

如何解决?

【问题讨论】:

  • 您的 C++ 程序将愉快地读取 fom cut 或任何其他通过标准输入管道输入的程序。无论您的真正问题是什么,它都不是您认为的那样,但如果没有更多信息,任何人都不太可能知道它是什么。
  • 什么是“这样的东西”?我不明白你想用你的 C++ 程序做什么,以及它与上面的命令行有什么关系。
  • 输出缓冲意味着a.out只会在1-8KB的输出累积或cut退出时接收输入。
  • @ThomasSablik 标准输出在连接tty 时是行缓冲的,否则是全缓冲的。 libc 就是这样做的,因此它适用于几乎所有的 Linux 程序。见pixelbeat.org/programming/stdio_buffering
  • @ThomasSablik 是的,ping 每行刷新其输出。我猜它有手动fflush(stdout) 调用,或者使用setvbuf() 更改缓冲。或者不使用stdio。

标签: c++ bash pipe


【解决方案1】:

是的。 ping 实用程序是行缓冲的(它在输出每一行后执行fflush(stdout))。

您可以改为使用 GNU coreutils 中的 stdbuf 命令将整个管道设置为使用行缓冲:

stdbuf -oL -eL bash -c 'ping google.com | cut -d " " --fields 8 | ./a.out'

【讨论】:

  • @JohnKugelman 它在 stdbuf 下运行整个管道。当然,在这种情况下,仅运行 cut 就足够了。
  • 啊,有趣!我没有意识到stdbuf affects subprocesses
猜你喜欢
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多