阅读管道输入

时间:2013-07-17 09:34:08

标签: c++ linux macos pipe

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

显然我做错了什么/傻瓜。什么是正确的方法?

1 个答案:

答案 0 :(得分:1)

这取决于你想做什么。如果要在输入完成运行时退出,只需检查标准输入是否仍然有效。当输入程序终止时,它将获得EOF。

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

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