繁体   English   中英

来自名为 pipe 的 ifstream - 检查非阻塞是否有数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM