C/C++程序中的event该如何理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++程序中的event该如何理解相关的知识,希望对你有一定的参考价值。

参考技术A c c++并没有event功能。
不过一些事件循环框架 例如windows 的核心库和qt这类是有event的。 还有很多项目也用到event这个概念,这个玩意就是设计上的一个概念, 一般来说是用来降低耦合的, 比如我写了一个模块用来做IO, 成功后会发一个event, coordinator收到这个event会调用其他业务逻辑模块来做一些操作。 这种设计在C语言项目中比较多, 因为C语言的项目层次结构一般比较散比较平, 不太好做成层次结构, 需要消息队列这类手段来协调各种功能。

使用inotify 帮助理解代码的C 程序

【中文标题】使用inotify 帮助理解代码的C 程序【英文标题】:C program using inotify help in understanding code 【发布时间】:2016-01-23 19:19:14 【问题描述】:

我指的是inotify 的手册页,我遇到了这段代码

               if (event->mask & IN_ISDIR)
                   printf(" [directory]\n");
               else
                   printf(" [file]\n");

其中 event 是指向结构 inotify_event 的指针。

我无法理解这一行 if (event->mask & IN_ISDIR) 以及为什么在此处使用 bitwise AND

如何确定bitwise AND 应该在这里使用而不是其他? inotify 的手册页中没有提到它。

【问题讨论】:

您链接的页面显示 “可能在 read(2) 返回的掩码字段中设置以下位:... IN_ISDIR 此事件的主题是目录。” 这是一个不同的函数,但表明这是一个位域。 【参考方案1】:

这个按位与屏蔽了一个特定的位 (IN_ISDIR)。它正在测试是否设置了这一位。如果在event->mask 中设置了此位,则计算结果为真。

例如,

#include <stdio.h>

#define FIRST_BIT  1
#define SECOND_BIT 2
#define THIRD_BIT  4

int main() 
  int x = 3;  /* 3 in binary is 011 */

  if ( x & FIRST_BIT )
    printf("First bit is set\n");
  if ( x & SECOND_BIT )
    printf("Second bit is set\n");
  if ( x & THIRD_BIT )
    printf("Third bit is set\n");

会给出输出

    First bit is set
    Second bit is set

来自inotify.h

#define IN_ISDIR          0x40000000    /* event occurred against dir */

这个值只设置了一位。 (在二进制中,这是01000000000000000000000000000000。)与此(0x40000000)和某个变量的按位与将评估为0(如果变量在这里有0),或者如果变量在同一个地方有1,则为0x40000000。任何非零值都被认为是“真”。

从逻辑上讲,它正在测试event 是否来自目录(而不是文件)。

【讨论】:

干净整洁。谢谢@e0k【参考方案2】:

按位与只是检查是否设置了特定位的一种简单(并且非常常见)的方法。 手册页很清楚,如果设置了该位,则该事件是指一个目录。

【讨论】:

以上是关于C/C++程序中的event该如何理解的主要内容,如果未能解决你的问题,请参考以下文章

C/C++中我读取一个文本,如何正确的判断此文本已经读完,用feof会多循环一次,该如何解决

AUTO在C语言中的用法,下面小程序NUM编译结果是怎样的,该怎样理解?

MyEclipse 如何用java 开发C/S程序,最好给个简单的例子 先谢谢了

关于JAVA调用C的DLL库中的函数问题,传入一个含有指针的结构体指针

使用inotify 帮助理解代码的C 程序

如何理解c/c++和php语言的区别