日期:2014-05-16  浏览次数:20719 次

驱动中“位与”的问题
代码情况如下:
ssize_t globalfifo_read(struct file*filp,char __user*buf,size_t count,loff_t *ppos)
{
....

if(filp->f_flags&O_NONBLOCK) //如果非阻塞
{
....
}
......

}

问题:
if(filp->f_flags&O_NONBLOCK) 表示如果非阻塞,其中应该涉及“按位与”的问题,只是过程不明白,f_flags“按位与”O_NONBLOCK 怎么就得到非阻塞?请高手指教!举例展示一下“按位与”过程!

------解决方案--------------------
按位与,就是某个bits位有一个为0则结果的对应的bits位为0,两个bits位都为1的时候,结果的对应的bits才为1.

这里的bits,是把数值转化成二进制之后的每个位的值。

O_NONBLOCK一定是定义成:0x01、0x02、0x04、0x08类似这样转化成二进制之后只有某个bits为1的数值。暂时叫做“标志宏”吧。

filp->f_flags的每个bits表征一种状态。

因此filp->f_flags和某个“标志宏”(只有一个bits为1的宏)做“按位与”运算的时候,除非filp->f_flags对应的那个bits上也为1,结果才不为0.
------解决方案--------------------
"f_flags“按位与”O_NONBLOCK 怎么就得到非阻塞?"

这个原因在于你自己代码的设计逻辑。你可以检查一下O_NONBLOCK 宏和与它一起定义的宏的值,就知道你这个原设计逻辑是什么了。