linux epoll

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

发现了一些之前牛牛写的博文里有些说法彷佛不太准确,可是,人家倒是是经过实例演示了app

但是,光有终端上的显示结果,就去说明了本身定义的缘由也不稳当spa

一。进程

// epoll 标准读取设备事件

//demo-read.cit

#include <stdio.h>io

#include <unistd.h>event

#include <sys/epoll.h>gcc

 

int main(void)file

{

    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!\n");

            //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\n");

    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:

有时候,老生常谈仍是要谈谈啊。由于有些问题并非表面看到的那样瓜熟蒂落。也就是说,大多数时候,你都会碰到坑,你一次能跨过去,也许下次就摔死在这里啦

相关文章
相关标签/搜索