gpt4 book ai didi

android - C & Android 内核模块 : what happened with f_flags here?

转载 作者:行者123 更新时间:2023-11-30 17:59:25 25 4
gpt4 key购买 nike

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

有人有想法或解释吗?

编辑:

我也期望cat成为O_NONBLOCK,但是O_WRONLY是完全错误的。

我这样打开:

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

之后就没有 fcntl (而且这根本不会影响 my_open 。当然,我也尝试过使用 fcntl 来“重新设置”O_NONBLOCK,但没有成功。

最佳答案

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

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

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

沙查尔

关于android - C & Android 内核模块 : what happened with f_flags here?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11458211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com