我正在我的C程序中打开一个文件:
pcm->dfd = open(fname, O_RDONLY|O_NONBLOCK);然后打电话给select()和read()。
但我的问题是,O_NONBLOCK迷路了
ssize_t my_read(struct file *filp, char __user *user_buffer, size_t bytes_requested, loff_t *capture_ptr) {
if (filp->f_flags & O_NONBLOCK){
LOGI("mode: O_NONBLOCK");
}
else{
LOGI("mode: BLOCKING"); // <-- this is printed
}
..
}我也试过
pcm->dfd=open(fname, O_RDONLY|O_NONBLOCK);
// O_NONBLOCK does not work :/
int flags = fcntl(pcm->dfd, F_GETFL, 0);
fcntl(pcm->dfd, F_SETFL, flags | O_NONBLOCK);这不是日志问题,驱动程序也在阻塞模式下工作.
有什么主意吗?
编辑:
从打开的文件读取的代码非常简单:
size=read(pcm->dfd,inBuffer,inBufferBytes);我还检查了程序是否还有fcntl(),但没有.
编辑2:
难道O_NONBLOCK在我的用户程序(Android )中比内核中还有其他价值吗?我在内核头中搜索O_NONBLOCK,已经有两个不同的定义了。
我还在内核模块中检查了open-implementation,filp->f_flags是而不是 O_NONBLOCK。
发布于 2012-10-19 16:15:04
根据打开(2)手册的说法,传递O_NONBLOCK只会使open调用本身成为非阻塞的(您可能不希望如此)。这并不意味着打开的文件描述符也将处于非阻塞模式--必须在打开后使用fcntl()设置该模式。
https://stackoverflow.com/questions/11335398
复制相似问题