繁体   English   中英

C和Android内核模块:f_flags在这里发生了什么?

[英]C & Android kernel module: what happened with f_flags here?

我在Android中有一个自我编码的内核模块,可以使用O_RDONLY|O_NONBLOCK打开。

用户程序和内核模块中的O_NONBLOCK均为2048

我检查了

print..("O_NONBLOCK is %d", O_NONBLOCK)

在用户和内核空间。

但是现在,当我尝试检查是否设置了O_NONBLOCK时,我遇到了一个非常奇怪的问题:

static int my_open(struct inode *inode, struct file *filp) {

    if (filp->f_flags & O_NONBLOCK) {
        printk("O_NONBLOCK");
    } else {
        printk("NOT O_NONBLOCK");
        printk("O_NONBLOCK in my_open is: %d", O_NONBLOCK); // -> prints 2048
        printk("filp->f_flags in my_open is: %d", filp->f_flags); // -> prints 1, not 2048 or larger
    }
..
}

我尝试了其他方法:

cat my_device

但同样, filp->f_flags1

我假设O_RDONLY可能为0 ,而不是1 ,这意味着O_WRONLY

任何想法或解释?

编辑:

我也不要指望catO_NONBLOCK ,但O_WRONLY是完全错误的。

我以这种方式打开它:

pcm->dfd=open(fname, O_RDONLY|O_NONBLOCK);

并且以后没有fcntl (这根本不会影响my_open 。但是,当然,我也尝试用fcntl “重新设置” O_NONBLOCK而不走运。

您需要确保用户空间确实通过了您认为必须通过的内容。 我发现很难相信,例如,“猫”将通过“ NONBLOCK”。 没有理由。

在用户空间端使用strace来测试实际传递的内容。

另外,还有一点题外话,您确定要关心打开期间是否设置了O_NONBLOCK吗? 请记住,稍后也可以使用fcntl进行设置。

沙迦尔

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM