首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

驱动中“位与”的有关问题

2012-05-14 
驱动中“位与”的问题代码情况如下:ssize_t globalfifo_read(struct file*filp,char __user*buf,size_t coun

驱动中“位与”的问题
代码情况如下:
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 宏和与它一起定义的宏的值,就知道你这个原设计逻辑是什么了。

热点排行