• c++--ubuntu-libevent1-概述与安装-IO事件+信号事件


    1.概述与安装
    2.IO事件
    3.信号事件


    1.概述与安装

    备注:安装包:deb包 二进制文件:
               源码:  tar.gz
     

    1. #1.安装二进制文件
    2. apt-get download libevent-dev
    3. apt-get install libevent-dev
    4. #验证
    5. ls /usr/include/event.h
    6. #查看与解释
    7. ls #查看文件内容 dpkg 解压到deb中
    8. dpkg -x libevent-dev_2.0.21-stable-2ubuntu0.16.04.1_amd64.deb deb
    9. ls deb
    10. include lib share #3个 event2这个目录里
    11. #cd share/examples
    12. #hello-world.c 服务器 event-test.c 管道 signal-test.c 信号事件 time-test.c 定时器事件
    13. #2.源码
    14. wget https://github.com/libevent/libevent

    两个结构体+常用接口



    2.IO事件

      管道读代码1-fiforead.c
      
    创建事件集合:struct event ev; 
      监听事件:event_dispatch();
      操作的是全局变量:current_base
      

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. /*
    9. 回调函数 读取数据
    10. */
    11. void fifo_read(evutil_socket_t fd,short events,void *arg)
    12. {
    13. char buf[32]={0};
    14. int ret=read(fd,buf,sizeof(buf));
    15. if(-1==ret)
    16. {
    17. perror("read");
    18. exit(1);
    19. }
    20. printf("从管道读取%s\n",buf);
    21. }
    22. int mainread()
    23. {
    24. //1.创建管道
    25. int ret= mkfifo("fifo.tmp",00700);#管道的名字,权限
    26. if(-1==ret)
    27. {
    28. perror("mkfifo");
    29. exit(1);
    30. }
    31. //2.打开管道
    32. int fd=open("fifo.tmp",O_RDONLY);
    33. if(-1==ret)
    34. {
    35. perror("mkfifo");
    36. exit(1);
    37. }
    38. //3.创建事件
    39. struct event ev;
    40. //初始化事件集合 #Event.c中 创建 struct event_base 对象; 赋值给全局变量 current_base
    41. event_init();
    42. //4初始化事件 (把ev和fd绑定) include\event2 事件类型:EV_READ 文件 #event_compat.h
    43. //事件 关联的文件描述符 事件类型 回调函数 回调函数参数
    44. event_set(&ev,fd,EV_READ | EV_PERSIST,fifo_read,NULL);
    45. event_add(&ev,NULL);
    46. //开始监听
    47. event_dispatch();
    48. return 0;
    49. }

    添加参数 EV_PERSIST
     
    管道写代码:1-fifowrite.c
     

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. /*
    9. 主函数写数据
    10. */
    11. void main_write()
    12. {
    13. //1.创建管道 默认为阻塞
    14. int ret=mkfifo("fifo.tmp",00400|00200);
    15. if(-1==ret)
    16. {
    17. perror("mkfifo");
    18. exit(1);
    19. }
    20. //2.打开管道
    21. int fd=open("fifo.tmp",O_WRONLY);
    22. if(-1==fd)
    23. {
    24. perror("mkfifo");
    25. exit(1);
    26. }
    27. char buf[32]={0};
    28. while(1)
    29. {
    30. scanf("%s",buf);
    31. ret=write(fd,buf,strlen(buf));
    32. if(-1==ret)
    33. {
    34. perror("write");
    35. exit(1);
    36. }
    37. if(!strcmp(buf,"bye"))
    38. {
    39. break;
    40. }
    41. memset(buf,0,sizeof(buf));
    42. }
    43. }

    3.信号事件
    gcc 3-signal.c -o 3-signal -levent 编译
    ./3-signal  运行

    创建事件集合:struct event ev; struct event_base *base=event_base_new();
    监听事件:event_base_dispath();
     操作的是自定义变量:base

    3-signal.c 

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. /*
    11. 回调函数 读取数据
    12. */
    13. void signal_handler(evutil_socket_t fd,short events,void *arg)
    14. {
    15. struct event *ev=(struct event *)arg;
    16. printf("收到信号 %d\n",fd);
    17. signal_count++;
    18. if(signal_count>=2)
    19. {
    20. //把事件从集合中删除
    21. event_del(ev);
    22. }
    23. }
    24. int main()
    25. {
    26. //1.创建事件集合 函数查找 Event.c event_set()把事件加入到 current_base中 event_assign()把事件加入到指定的事件中
    27. struct event_base *base =event_base_new();
    28. //2.创建事件
    29. struct event ev;
    30. //3.事件与信号绑定
    31. event_assign(&ev,base,SIGINT,EV_SIGNAL|EV_PERSIST,signal_handler,&ev);
    32. //事件添加到集合中
    33. event_add(&ev,NULL);
    34. //监听集合
    35. event_dispatch();
    36. //释放集合
    37. event_base_free(base);
    38. return 0;
    39. }



     

  • 相关阅读:
    HTML小游戏5 —— 水果忍者(附完整源码)
    [附源码]java毕业设计大学生兼职招聘网站
    【C++】构造函数初始化列表 ④ ( 构造函数 和 析构函数 调用顺序分析 )
    2022 年坑过我的 JAVA 面试题
    封神台 SQL注入 靶场 (猫舍)手动注入
    Python常用的新模块特性
    san.js源码解读之模版解析(parseTemplate)篇——readIdent函数
    无问芯穹获近 10 亿元累计融资,致力于成为大模型时代首选的“算力运营商”
    logback-spring.xml 中根据不同的业务表示,分类打印到不同的文件夹、时区动态设置
    CCLINK IEFB总线转ETHERNET/IP网络的协议网关使欧姆龙和三菱的数据互通的简单配置方法
  • 原文地址:https://blog.csdn.net/aggie4628/article/details/126133169