打开文件O_NONBLOCKING在内核模块中丢失

我在我的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()进行设置.

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...