Dar*_*ius 3 c++ nonblocking getline
是否有任何方法可以调用getline(),如果没有输入,就不会阻塞并等待?
我有以下代码:
while(true){
if(recv(sd, tBuffer, sizeof(tBuffer), MSG_PEEK | MSG_DONTWAIT) > 0) break;
getline(cin,send);
}
Run Code Online (Sandbox Code Playgroud)
我想等待输入,但是如果我在sd套接字处接收到一些数据,我想停止等待数据并退出while。我的代码现在停留在的第一次迭代中getline()。我要评估getline(),如果没有可用的输入,请返回if。
这可能吗?
PS:我尝试过使用cin.peek(),但是这也阻止了输入。
您应该可以通过在标准输入文件描述符0上设置非阻塞模式来做到这一点:
int flags = fcntl(0, F_GETFL, 0);
fcntl(0, F_SETFL, flags | O_NONBLOCK);
Run Code Online (Sandbox Code Playgroud)
现在,如果没有可用的输入,则基础read()系统调用将返回0,并std::cin认为这是文件结尾,并设置为eof()on std::cin。
当您希望再次从标准输入中读取时,只需输入clear()流的状态。
唯一复杂的因素是,这使得很难检测到上的实际文件结束条件std::cin。当标准输入是交互式终端时,没什么大问题;但是如果标准输入可以是一个文件,那将是一个问题。
在这种情况下,您唯一可行的选择是std::cin完全放弃,将非阻塞模式置于文件描述符0 poll()或select()它上,以确定何时需要读取某些内容,然后再进行读取read()。
虽然你也可以使用poll()或select()与std::cin,这会变得复杂,因为你需要明确检查是否有在已经缓冲什么std::cin的streambuf,因为那会,很显然,抢占任何形式的poll()或select()检查; 但是通过尝试从中读取内容std::cin,您仍然冒着读取缓冲数据的风险,然后尝试read()从现在处于非阻塞模式的基础文件描述符进行读取,这会导致伪造的文件结束条件。
总结:您需要花费更多的时间阅读和理解文件流以及流缓冲区的工作方式;文件描述符实际上如何工作,非阻塞模式如何工作;为了弄清楚您将需要使用的正确逻辑。
哦,如果您坚持使用std::cin和进行非阻塞路由getline(),您将没有简单的方法来确定字符串返回的字符串是否是getline()因为getline()实际上是从标准输入中读取换行符,还是到达了文件的过早伪造末尾条件,而不是实际上已经读取了整个输入行。
因此,在非阻塞模式and下std::cin,您将不得不使用read()而不是getline()。