C&Android内核模块:f_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_flags 1.

我认为也许0 O_RDONLY但不是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 进行设置。

沙查尔

最新更新