zoukankan      html  css  js  c++  java
  • linux epoll

    今天,网上浏览一下,又看到了epoll话题,同时,也看了下例子

    发现了一些以前牛牛写的博文里有些说法似乎不太准确,但是,人家却是是通过实例演示了

    可是,光有终端上的显示结果,就去说明了自己定义的原因也不妥当

    一。

    // epoll 标准读取设备

    //demo-read.c

    #include <stdio.h>

    #include <unistd.h>

    #include <sys/epoll.h>

    int main(void)

    {

        int epfd,nfds;

        struct epoll_event ev,events[5];//ev用于注册事件,数组用于返回要处理的事件

        epfd = epoll_create(1);//只需要监听一个描述符——标准输入

        ev.data.fd = STDIN_FILENO;

        ev.events = EPOLLIN|EPOLLET;//监听读状态同时设置ET模式

        epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &ev);//注册epoll事件

        for(;;)

        {

            nfds = epoll_wait(epfd, events, 5, -1);

            for(int i = 0; i < nfds; i++)

            {

                if(events[i].data.fd==STDIN_FILENO)

                    printf("Something happened with stdin! ");

                //ev.data.fd = STDIN_FILENO;

                //ev.events = EPOLLIN|EPOLLET;                        //设置ET模式

                //epoll_ctl(epfd, EPOLL_CTL_MOD, STDIN_FILENO, &ev);    //重置epoll事件(ADD无效)

            }

        }

    }

    #gcc -o demo-read.o -c demo-read.c

    #gcc -o demo-read demo-read.o

    #./demo-read

    abc
    Something happened with stdin!

    如果你打开注释的话,每次读取后,重置边缘重发,就会不停地输出

    Something happened with stdin!
    Something happened with stdin!
    Something happened with stdin!
    Something happened with stdin!
    Something happened with stdin!

    这个好理解,相当于每次都告诉epoll,“输入缓冲有数据,就返回读就绪”

    这里的原因和结果都没问题

    二。

    //epoll 标准输出设备

    #include <stdio.h>

    #include <unistd.h>

    #include <sys/epoll.h>

    int main(void)

    {

        int epfd,nfds;

        struct epoll_event ev,events[5];//ev用于注册事件,数组用于返回要处理的事件

        epfd = epoll_create(1);//只需要监听一个描述符——标准输出

        ev.data.fd = STDOUT_FILENO;

        ev.events = EPOLLOUT|EPOLLET;//监听写状态同时设置ET模式

        epoll_ctl(epfd, EPOLL_CTL_ADD, STDOUT_FILENO, &ev);//注册epoll事件

        printf("begin to epoll ");

        int count = 0;

        for(;;)

        {

            nfds = epoll_wait(epfd, events, 5, -1);

            for(int i = 0; i < nfds; i++)

            {

                if(events[i].data.fd==STDOUT_FILENO)

                {

                    count++;

                    printf("welcome to epoll's word!");

                    //ev.data.fd = STDOUT_FILENO;

                    //ev.events = EPOLLOUT|EPOLLET;//设置ET模式

                    //epoll_ctl(epfd, EPOLL_CTL_MOD, STDOUT_FILENO, &ev);//重置epoll事件(ADD无效)

                }

            }

        }

    }

    #gcc -g -o demo-write.o -c demo-wirte.c

    #gcc -g -o demo-write demo-write.o

    #gdb

    #file ./demo-write

    (gdb)b 23

    (gdb)r

    (gdb)c

    (gdb)c

    (gdb)c

    (gdb) p count
    $1 = 3

    看到没有,这里就不是说打印的信息没有被清除缓冲,epoll_wait就挂起进程了。

    事实上是,只要标准写缓冲未满,那么epoll_wait就不会挂起!!!!

    这里就是网上信息的一个误区。。。。

    这里打开注释行后的效果就相当于在输入后加入了换行,每次都能从写缓冲区取出显示在控制台上

    Finally:

    有时候,老生常谈还是要谈谈啊。因为有些问题并不是表面看到的那样顺理成章。也就是说,大多数时候,你都会碰到坑,你一次能跨过去,也许下次就摔死在这里啦

  • 相关阅读:
    Netbackup 命令之bplist
    定时任务crond生产实战经验
    数据分析的应用
    数据分析的三个常见误区
    Linux文件系统目录结构
    Linux系统介绍
    两款傻瓜化小白爬虫工具推荐
    时间管理利器之一:RescueTime 自动记录时间
    Lambda 表达式
    IDEA 配置 不需要提交的文件 保证git代码干净
  • 原文地址:https://www.cnblogs.com/woodzcl/p/7920733.html
Copyright © 2011-2022 走看看