epoll一点思考(4)

epoll EPOLLONESHOT

EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里,这样IN事件会被保留。EPOLLONESHOT区别就是,每次IN事件都是串行进行,而不是多个in事件并行。

ET模式与LT模式EPOLLONESHOT处理相同

(1)设置EPOLLONESHOT,创建线程读取,线程中不在将socket放入epoll队列,后续再发数据不触发in事件,无法读取。代码如下:

#include <sys/socket.h>
#include <sys/epoll.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <iostream>
using namespace std;
#define MAX_EVENTS 10000

int epfd = 0;

void* process(void* ptr)
{
    int sockfd = *(int*)ptr;
    char buf;
    while(read(sockfd, &buf, 1) > 0)
    {
        printf("%c\n",buf);
        sleep(5);
    }
    cout << "thread out " << endl;
    //event->events = EPOLLIN | EPOLLET;
    //epoll_ctl(epfd, EPOLL_CTL_MOD, sockfd, event);
}

int main(int argc, char **argv)
{
    short port = 6002; // default port   
    int listenFd = socket(AF_INET, SOCK_STREAM, 0);
    int reuse = 1;
    setsockopt(listenFd , SOL_SOCKET , SO_REUSEADDR , &reuse , sizeof(reuse));
    fcntl(liste
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值