加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:00:36 所属栏目:百科 来源:网络整理
导读:我在我的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_
我在我的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()进行设置.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读