IO复用

2020-10-15  本文已影响0人  李伟13

select

#include <sys/select.h>
int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout);

sucess return 就绪的文件描述符总数
failed  return -1 and set errno

如果在等待期间收到新号
return -1 and set errno to EINTR
FD_ZERO(fd_set* fdset);     将fd_set变量的所有位初始化为0。
FD_SET(int fd, fd_set* fdset);    在参数fd_set指向的变量中注册文件描述符fd的信息。
FD_CLR(int fd, fd_set* fdset);    参数fd_set指向的变量中清除文件描述符fd的信息。
FD_ISSET(int fd, fd_set* fdset);  若参数fd_set指向的变量中包含文件描述符fd的信息,则返回真。
for (i=0; i<5;i++)
{
    memset(&client,0,sizeof (client));
    addrlen = sizeof(client);
    fds[i] = accept(sockfd,(struct sockaddr*)&client,&addrlen);
    if(fds[i] > max)
        max = fds[i];
}

while(1){
    FD_ZERO(&rset);
    for (i = 0; i< 5; i++ ) {
        FD_SET(fds[i],&rset);
    }
    puts("round again" );
    select(max+1,&rset,NULL,NULL,NULL);
    for(i=0;i<5;i+1) {
    if (FD_ISSET(fds[i],&rset)){
        memset(buffer ,0, MAXBUF);
        read(fds[i],buffer,MAXBUF);
        puts(buffer);
    }
}

poll

epoll

创建一个epoll句柄(epoll_create )

#include <sys/epoll.h>
int epoll_create (int __size);
return epollfd;

注册事件

int epoll_ctl (int __epfd, int __op, int __fd, struct epoll_event *__event);
sucess return 0
failed  return -1 and set errno

op(operation?)

等待描述符就绪

int epoll_wait(int__epfd,struct epoll_event *__events,int _maxevents,int __timeout);
return 就绪的文件描述符个数
struct epoll_event {
    uint32_t events;        //epoLL事件
    epoll_data_t data;      //用户数据
} __EPOLL_PACKED;

typedef union epoll_data {
    void *ptr;      可以用改指针指向自定义的参数
    int fd;     可以用改成员指向epoll所监控的文件描述符
    uint32_t u32;
    uint64_t u64;
} epoll_data_t;
上一篇 下一篇

猜你喜欢

热点阅读