我正在尝试了解 OSX/Linux 中的管道。我有一个名为 foo 的实用程序。我希望它解析我从其他任意实用程序通过管道传输给它的任何输入,如果没有输入则退出。我目前正在阅读 cin 的内容,如果我将某些内容传递给 foo,它就可以正常工作。但是,如果我不将任何内容通过管道传输到 foo,则读取到 cin 会无限期地阻塞。
显然我做错了/愚蠢的事情。解决这个问题的正确方法是什么?
这取决于你想做什么。如果您想在输入完成运行后退出,只需检查标准输入是否仍在工作。当输入程序终止时,它会得到一个 EOF。
while (cin.good()) {
cin << whatever;
...
}
但是,如果您不想等到输入程序终止,那么您可能必须等待一些超时。最简单的方法是select()
在文件描述符 0 上使用,如果有数据则只读取,如果有超时则结束。或者,如果你想用 C++ 的方式来做,我推荐Boost Asio。您可以posix::stream_descriptor
用于处理 Posix 系统下的本机文件描述符。