c - 非阻塞读永不返回

标签 c linux nonblocking file-descriptor ubuntu-15.04

我正在尝试进行非阻塞读取,但该函数永远不会返回。有人可以提出建议吗?这是我设置非阻塞 fd 的代码。

from_ap = open(FFS_GBEMU_OUT, O_RDWR|O_NONBLOCK);
if (from_ap < 0)
    return from_ap;

我也试过类似的结果

from_ap = open(FFS_GBEMU_OUT, O_RDWR);
int status = fcntl(from_ap, F_SETFL, fcntl(from_ap, F_GETFL, 0) | O_NONBLOCK);

if (status == -1){
perror("calling fcntl");

这里是我调用读取函数的地方:

rsize = read(from_ap, cport_rbuf, ES1_MSG_SIZE);
if (rsize < 0) {
    printf("error %zd receiving from AP\n", rsize);
    return NULL;
}

我也试过类似的结果:

fd_set readset;
struct timeval tv;
FD_ZERO(&readset);
FD_SET(from_ap, &readset);
tv.tv_sec = 0;
tv.tv_usec = 100;

result = select(from_ap+1, &readset, NULL, NULL, &tv);

if (result > 0 && FD_ISSET(from_ap, &readset)){
    printf("there was something to read\n");
    rsize=read(from_ap,cport_rbuf,ES1_MSG_SIZE);
}

收到的最后一条消息是“有东西要读”,代码没有进一步进展。我做错了什么?这不是一个多线程程序,因此没有人可以更改标志,但无论如何我已经通过在阅读前打印回标志来确认它们。

最佳答案

设备是否支持 O_NONBLOCK?这似乎是来自 GitHub 的代码 gbsim .阅读 gbsim,驱动程序完全有可能不支持非阻塞调用。

关于c - 非阻塞读永不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30540636/

相关文章:

c++ - 使用 inotify 监控文件

c - pthread_cond_wait(条件变量)如何仅一次而不是多次解锁所有线程?

CURL 在发出 http 请求时的奇怪行为(错误 400)

c - 编写 C 程序删除字符串之间的空格

c - bmp 图像到 c 中的矩阵(二维数组)

linux - 读取日志文件并获取两个日期之间的条目

java - 如何在 Undertow HttpHandler 中发送异步响应

python - Django 中的 Fabric。如何解决等待 SSH 完成的 View

linux - 在 Unix/Linux 中更改新复制文件的权限

android - LG 设备未在 ADB 设备中列出