zoukankan      html  css  js  c++  java
  • epoll函数

    函数epoll

    1. 函数epoll_creat: 该函数生成一个epoll专用的文件描述符

    int epoll_creae(int size);

    分析:

    • size:epoll上能关注的最大描述符数

    2. epoll_ctl:用于控制某个epoll文件描述符事件,可以注册、修改、删除

    int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 

    参数:

    1. efd:epoll_create函数的返回值

    2. op:对该监听红黑树所做的操作

    • EPOLL_CTL_ADD:添加新的fd到epfd中
    • EPOLL_CTL_MOD:修改fd在监听红黑树的监听事件
    • EPOLL_CTL_DE:将一个fd从监听红黑树摘下

    3. fd:待监听的fd

    4. event:本质struct epoll_event 结构体地址

     1 typedef union epoll_data
     2 {
     3     void*       ptr;
     4     int         fd;  //对应监听的fd
     5     uint32_t    u32;
     6     uint64_t    u64;
     7 } epoll_data_t;
     8 
     9 struct epoll_event
    10 {
    11     uint32_t     events;  /* epoll事件 */
    12     epoll_data_t data;    /* 用户数据 */
    13 };

    3. 等待IO事件发生 - 可以设置阻塞的函数

    1 int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

    参数:

    • efds:epoll_create函数的返回值
    • events:传出参数【数组】满足监听条件的哪些fd结构体
    • maxevents:数组元素的总个数(1024) struct epoll_events [1024]:
    • timeout:
    • ET:边缘触发只有数据到来才触发,不管缓冲区是否还有数据(缓冲区剩余未读尽的数据的数据不会导致epoll_wait返回。新的时间满足,才会触发)
    • LT:水平触发 ---默认采用模式(缓冲区剩余未读尽的数据会导致epoll_wait返回。)

    1. 测试代码:

     1 #include <errno.h>
     2 #include <unistd.h>
     3 #include <stdlib.h> 
     4 #include <stdio.h>
     5   
     6 #define MAXLINE 10
     7  
     8 int main(int argc, char *argv[])
     9 {
    10     int efd, i;
    11     int pfd[2];
    12     pid_t pid;
    13     char buf[MAXLINE],ch = 'a';
    14     pipe(pfd);
    15     pid = fork();
    16  
    17     if (pid == 0)  //子写 
    18     {
    19         close(pfd[0]); //关闭读
    20         while (1)
    21         {
    22             for (i = 0; i < MAXLINE / 2; i++) //aaaa
    
    23                 buf[i] = ch;
    24             buf[i - 1] = '
    ';
    25             ch++;
    26 
    27             for (; i < MACLINE; i++) //bbbb
    
    28                 buf[i] = ch;
    29             buf[i - 1] = '
    ';
    30             ch++;
    31  
    32             write(pdf[1], buf, sizeof(buf)); //aaaa
    bbbb
    
    33             sleep(5);
    34         }
    35         close(pfd[1]);
    36     }
    37     else if (pid < 0) //父进程读
    38     {
    39         struct epoll_event;
    40         struct epoll_event resevent[10];
    41         int res, len;
    42  
    43         close(pfd[1]); //关闭写
    44         efd = epoll_create(10);
    45  
    46         //event.events = EPOLLIN | EPOLLET   // ET边沿触发
    47         even.events = EPOLLIN;               // LT水平触发(默认)
    48         event.data.fd = pfd[0];
    49         epoll_ctl(efd, EPOLL_CTL_ADD, pfd[0], &event);
    50  
    51         while (1)
    52         {
    53             res = epoll_wait(efd, resevent, 10, -1);
    54             printf("res %d
    ", res);
    55             if (resevent[0].data.fd == pfd[0])
    56             {
    57                 len = read(pfd[0], buf, MACLINE/2);
    58                 write(STDOUT_FILENO, buf, len);
    59             }
    60         }
    61         close(pfd[pfd[0]);
    62         close(efd);
    63     }
    64     else
    65     {
    66         perror("fork");
    67         exit(-1);
    68     }
    69     return 0;
    70 }
    #include <errno.h>
    #include <unistd.h>
    #include <stdlib.h> 
    #include <stdio.h>
      
    #define MAXLINE 10
     
    int main(int argc, char *argv[])
    {
        int efd, i;
        int pfd[2];
        pid_t pid;
        char buf[MAXLINE],ch = 'a';
        pipe(pfd);
        pid = fork();
     
        if (pid == 0)  //子写 
        {
            close(pfd[0]); //关闭读
            while (1)
            {
                for (i = 0; i < MAXLINE / 2; i++) //aaaa
    
                    buf[i] = ch;
                buf[i - 1] = '
    ';
                ch++;
    
                for (; i < MACLINE; i++) //bbbb
    
                    buf[i] = ch;
                buf[i - 1] = '
    ';
                ch++;
     
                write(pdf[1], buf, sizeof(buf)); //aaaa
    bbbb
    
                sleep(5);
            }
            close(pfd[1]);
        }
        else if (pid < 0) //父进程读
        {
            struct epoll_event;
            struct epoll_event resevent[10];
            int res, len;
     
            close(pfd[1]); //关闭写
            efd = epoll_create(10);
     
            //event.events = EPOLLIN | EPOLLET   // ET边沿触发
            even.events = EPOLLIN;               // LT水平触发(默认)
            event.data.fd = pfd[0];
            epoll_ctl(efd, EPOLL_CTL_ADD, pfd[0], &event);
     
            while (1)
            {
                res = epoll_wait(efd, resevent, 10, -1);
                printf("res %d
    ", res);
                if (resevent[0].data.fd == pfd[0])
                {
                    len = read(pfd[0], buf, MACLINE/2);
                    write(STDOUT_FILENO, buf, len);
                }
            }
            close(pfd[pfd[0]);
            close(efd);
        }
        else
        {
            perror("fork");
            exit(-1);
        }
        return 0;
    }
  • 相关阅读:
    查找oracle数据文件、表空间的位置
    select into 给多变量赋值
    关于Union 中 ORA-12704:字符集不匹配问题的解决
    weblogic线程阻塞性能调优(图解)
    window系统无法访问局域网内文件共享的问题
    查看oracle的sql语句历史记录和锁表的情况
    <c:forEach>标签的使用 JSTL
    CAS服务下单点登录(服务端与客户端)
    cas 配置数据源 , 解决CAS 不支持你提供的凭证 .
    信号量通俗释义
  • 原文地址:https://www.cnblogs.com/sunbines/p/10263749.html
Copyright © 2011-2022 走看看