[英]ifstream from named pipe - check nonblocking if there is data
要检查“常规” std::istream
是否有任何未决数据,我可以这样做:
bool has_pending_data(std::istream& s) {
return s.peek() >= 0;
}
然而,这对于标准输入和命名管道是不同的。 如果我这样做:
if (has_pending_data(std::cin)) {
// process incoming data
} else {
// do some periodic tasks
}
永远不会到达 else 分支,因为执行将阻塞peek
function。有没有办法避免这种阻塞标准输入和命名管道?
问题是当std::cin
在 I/O 缓冲区中没有字符时, peek
不会返回 EOF,而是等到至少写入一个字符。
这是因为 iostream 库不支持非阻塞 I/O 的概念。 我认为 C++ 标准中没有任何内容。
此代码可以帮助您在不阻塞的情况下检查标准输入中是否存在数据:
std::cin.seekg(0, std::cin.end);
int length = std::cin.tellg();
if (length < 0) return; //- no chars available
如果标准输入有一些数据——不要忘记将 position 设置回开头。
std::cin.seekg(0, std::cin.beg);
或者,您可以尝试使用select function。它通常用于.networking 的东西,但如果您将标准输入的文件描述符传递给它,它就会工作得很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.