使用 fgets 作为非阻塞函数 C++

Zac*_*ach 2 c++ fgets nonblocking

我正在编写一个程序,使用函数 fgets 从 stdin 循环读取,如下所示:

while(fgets(buffer2, BUFFERSIZE , stdin) != NULL){
  //Some code  
}
Run Code Online (Sandbox Code Playgroud)

我希望我的代码是非阻塞的,也就是说:当用户当前没有输入时,我不希望程序保留在“fgets”行上。
我该怎么做?

Alo*_*ave 6

fgets()是一个阻塞函数,它意味着等待数据可用。

如果要执行异步 I/O,可以使用select()poll()epoll()。然后当有数据可用时从文件描述符执行读取。

这些函数使用 FILE* 句柄的文件描述符,通过以下方式检索:

int fd = fileno(f);
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 Unix 或 Linux,那么一种解决方案是将文件使用的文件描述符标记为非阻塞。例子:

#include <fcntl.h>  
FILE *handle = popen("tail -f /als/als_test.txt", "r"); 
int fd = fileno(handle);  
flags = fcntl(fd, F_GETFL, 0); 
flags |= O_NONBLOCK; 
fcntl(fd, F_SETFL, flags); 
Run Code Online (Sandbox Code Playgroud)

fgets现在应该是非阻塞的,并且会返回 null 并为您设置错误代码。