今天,网上浏览一下,又看到了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:
有时候,老生常谈还是要谈谈啊。因为有些问题并不是表面看到的那样顺理成章。也就是说,大多数时候,你都会碰到坑,你一次能跨过去,也许下次就摔死在这里啦