c++ - 读取管道输入

标签 c++ linux macos pipe

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

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

最佳答案

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

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

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

关于c++ - 读取管道输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17696188/

相关文章:

c++ - 我可以在 Mac 上使用 C++ 获得 -1 退出代码吗?

c++ - 使用 EOF 函数作为条件

linux - 使用 sed 打印以两种不同模式开头的行

python - 子进程管理 - 杀死一个子进程

c++ - Mac OS X 上的异步 I/O

c++ - 使用Boost序列化和发送数据结构?

c++ - LCS 的后缀树与后缀数组

linux - 如何在 Ubuntu 终端中创建文件,指定内容?

linux - Bash 按包含年份和缩写月份的文件名对文件进行排序

objective-c - 使用 NSAlert 处理按下哪个按钮的正确方法是什么