读取管道输入

Posted

技术标签:

【中文标题】读取管道输入【英文标题】:Reading piped input 【发布时间】:2013-07-17 09:34:08 【问题描述】:

我正在尝试了解 OSX/Linux 中的管道。我有一个名为 foo 的实用程序。我希望它解析我从其他任意实用程序传递给它的任何输入,如果没有输入则退出。我目前正在阅读 cin 的内容,如果我将某些内容传递给 foo,它就可以正常工作。但是,如果我不将任何内容通过管道传输到 foo,则读取到 cin 会无限期地阻塞。

显然我做错了/愚蠢的事情。解决这个问题的正确方法是什么?

【问题讨论】:

您是否尝试过用键盘输入输入并在完成时输入 cntr+d? 阻塞是从标准输入读取的程序的预期行为。尝试不带参数运行cat,您会看到它具有相同的行为。还可以尝试@hetepeperfan 的建议,这是用户在这些情况下的期望。 我接受了上面的建议,只是复制了“cat”实用程序的行为。它不能解决问题,但我可以忍受。谢谢你。 【参考方案1】:

这取决于你想做什么。如果您想在输入完成运行后退出,只需检查标准输入是否仍在工作。当输入程序终止时,它会得到一个EOF。

while (cin.good()) 
    cin << whatever;
    ...

但是,如果您不想等到输入程序终止,那么您可能必须等待一些超时。最简单的方法是在文件描述符0上使用select(),如果有数据则只读取,如果有超时则结束。或者,如果您想以 C++ 方式进行操作,我推荐Boost Asio。您可以使用posix::stream_descriptor 处理 Posix 系统下的本机文件描述符。

【讨论】:

嗨,彼得。感谢您提出使用 select 的建议。尽管在这种情况下接受了 syam 的建议,但它似乎确实解决了我的问题。另外,我在这个过程中学到了一些关于文件描述符的知识。谢谢!

以上是关于读取管道输入的主要内容,如果未能解决你的问题,请参考以下文章

键盘输入错误地重定向到命名管道读取

C中的管道,用于读取标准输入的缓冲区

从Ada中的管道读取输入

使用输入管道和管理键盘

在无限while循环中从管道输入中读取行

Jenkins声明性管道:如何从输入步骤中读取选择?