0

我在 Android 中有一个自编码内核模块,我用O_RDONLY|O_NONBLOCK.

O_NONBLOCK2048用户程序和内核模块中。

我用

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_RDONLY但不是1这意味着O_WRONLY

任何人的想法或解释?

编辑:

也不指望catbeeing O_NONBLOCK,但这O_WRONLY是完全错误的。

我这样打开它:

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

并且没有fcntl以后(这根本不应该影响。但当然我也尝试过my_open“重新设置”但没有运气。O_NONBLOCKfcntl

4

1 回答 1

0

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

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

另外,有点离题,你确定你关心是否在打开期间设置了 O_NONBLOCK 吗?请记住,稍后也可以使用 fcntl 设置它。

沙查尔

于 2012-07-12T19:04:59.440 回答