我在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
。任何想法或解释?
编辑:
我也不希望
cat
蜂鸣O_NONBLOCK
,但是O_WRONLY
完全错误。我以这种方式打开它:
pcm->dfd=open(fname, O_RDONLY|O_NONBLOCK);
并且以后没有
fcntl
(这完全不会影响my_open
。但是当然我也尝试用
O_NONBLOCK
“重设” fcntl
而没有运气。 最佳答案
您需要确保用户空间确实通过了您认为必须通过的内容。我发现很难相信,例如,“猫”会通过“ NONBLOCK”。没有理由。
在用户空间端使用strace来测试实际传递的内容。
另外,还有一点题外话,您确定要关心打开期间是否设置了O_NONBLOCK吗?请记住,稍后也可以使用fcntl进行设置。
沙迦尔