我在我的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 NDK)中的其他值是否可能比在内核中有其他值?我在kernel-headers中搜索了O_NONBLOCK,并且已经有2个不同的定义.
我还检查了我的内核模块中的open-implementation,并且已经有filp-> f_flags不是O_NONBLOCK.
解决方法
根据
open(2) man-page,传递O_NONBLOCK只会使开放调用本身无阻塞(你可能不需要).这并不意味着打开的文件描述符也将处于非阻塞模式 – 您必须在打开后使用fcntl()进行设置.