Zac*_*ach 2 c++ fgets nonblocking
我正在编写一个程序,使用函数 fgets 从 stdin 循环读取,如下所示:
while(fgets(buffer2, BUFFERSIZE , stdin) != NULL){
//Some code
}
Run Code Online (Sandbox Code Playgroud)
我希望我的代码是非阻塞的,也就是说:当用户当前没有输入时,我不希望程序保留在“fgets”行上。
我该怎么做?
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 并为您设置错误代码。
| 归档时间: |
|
| 查看次数: |
16885 次 |
| 最近记录: |