C 打开文件O_非阻塞在内核模块中丢失

C 打开文件O_非阻塞在内核模块中丢失,c,file-io,blocking,kernel-module,C,File Io,Blocking,Kernel Module,我正在C程序中打开一个文件: pcm->dfd = open(fname, O_RDONLY|O_NONBLOCK); 然后再打电话选择并阅读 但我的问题是,O_非块在某些情况下丢失了: 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){

我正在C程序中打开一个文件:

pcm->dfd = open(fname, O_RDONLY|O_NONBLOCK);
然后再打电话选择并阅读

但我的问题是,O_非块在某些情况下丢失了:

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      
    }
    ..
}
这不是日志记录问题,驱动程序的行为也与阻塞模式相同

有人有主意吗

编辑:

从打开的文件读取的代码非常简单:

size=read(pcm->dfd,inBuffer,inBufferBytes);
我还检查了程序,如果有fcntl,其他人,但没有

编辑2:

有没有可能,O_NONBLOCK在我的用户程序Android NDK中的值与内核中的值不同?我在内核头中搜索了O_NONBLOCK,已经有了两种不同的定义


我还检查了内核模块中的open实现,并且已经有filp->f_标志不是O_NONBLOCK。

根据,传递O_NONBLOCK只会使open调用本身非阻塞,这可能是您不想要的。这并不意味着打开的文件描述符也将处于非阻塞模式-您必须在打开后使用fcntl设置该模式。

显示执行读取的代码。使用O_非阻塞打开文件会导致UB a.k.a.未指定的行为。是的,当然,但我是开放文件内核模块的开发人员,可以控制发生的事情。。但是,如上所述,O_NONBLOCK信息不再对我可用。这是常规文件系统中的常规文件、特殊文件系统(如/sys或/proc)中的常规文件还是设备文件?如果我理解正确,您尝试使用O_NONBLOCK打开的文件实际上是字符设备。与其他一些人所说的相反,如果驱动程序支持,使用O_NONBLOCK打开字符设备是有效且定义良好的。您能展示一下您的开放式实现、模块初始化功能和chrdev_ops结构吗?
size=read(pcm->dfd,inBuffer,inBufferBytes);