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

时间:2012-07-12 18:26:11

标签: android c kernel-module flags

我在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

我认为0可能O_RDONLY1不是O_WRONLY

任何想法或解释?

编辑:

期待cat正在O_NONBLOCK,但O_WRONLY完全错误。

我这样打开它:

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

之后没有fcntl(这根本不会影响my_open。 但当然我也试图用O_NONBLOCK“重新设置”fcntl而没有运气。

1 个答案:

答案 0 :(得分:0)

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

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

另外,有点offtopic,你确定你关心O_NONBLOCK是否在打开期间设置?请记住,以后也可以使用fcntl进行设置。

Shachar