读取管道输入
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 的建议,但它似乎确实解决了我的问题。另外,我在这个过程中学到了一些关于文件描述符的知识。谢谢!以上是关于读取管道输入的主要内容,如果未能解决你的问题,请参考以下文章