[英]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_flags
为1
。
我假设O_RDONLY
可能为0
,而不是1
,这意味着O_WRONLY
。
任何想法或解释?
编辑:
我也不要指望cat
蜂O_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.