幾個例子,看懂poll和epoll(2)

       上一篇,講了幾個簡單的例子,相信你們對poll和epoll,已經有了一個初步瞭解。這一節,再新增幾個case。ui

       有幾個名詞先解釋下:事件

epoll_event: 註冊所感興趣的事件和回傳所發生待處理的事件。可能的取值爲:it

EPOLLIN :表示對應的文件描述符能夠讀;
EPOLLOUT:表示對應的文件描述符能夠寫;io

1. epoll邊沿出發,有些又有讀:      event

#include <stdio.h>
#include <sys/eventfd.h>
#include <sys/epoll.h>
#include <memory.h>im

int main()
{
    uint64_t value = 2;
    int event_fd = eventfd(0, EFD_NONBLOCK);error

    int i = 0;        
    int status = 0;epoll

    /* epoll */
    int epfd = 0;
    struct epoll_event epevent[1], poolevent;
    printf("event_fd=%d\n", event_fd);di

    int ret = fork();
    if (ret < 0)
    {
        printf("fork error\n");
        return(1);
    }文件

    if (ret == 0)
    {
        epfd = epoll_create(1);
        if (epfd == -1) {
            printf("\nepoll_create, failed\n");
            return -1;
        }    

        poolevent.events = EPOLLOUT | EPOLLIN | EPOLLET;
        poolevent.data.fd = event_fd;


        sleep(5);        
        ret = epoll_ctl(epfd, EPOLL_CTL_ADD, event_fd, &poolevent);
        if (ret != 0)
        {
            printf("\nepoll_ctl, failed\n");
            close(epfd);
            return -1;
        }

        for(i = 0; i < 2; i++) 
        {
            printf("Child: wait events ... times: %d\n", i);
            epoll_wait(epfd, epevent, 1, -1); // here to monitor only 1 event(epevent), so the third parameter is 1
            if((epevent[0].events & EPOLLIN))
            {
                fprintf (stderr, "epoll in is %d\n", epevent[0].events);
        read(event_fd, &value, sizeof(value));
            }
        else if((epevent[0].events & EPOLLOUT))
        {
                fprintf (stderr, "epoll out is %d\n", epevent[0].events);
        }
        else
        {
                fprintf (stderr, "epoll unknown events %d\n", epevent[0].events);
                close (epevent[0].data.fd);
                return(1);
        }
    } 
    
        close(epfd);
        printf("Child: exit\n");
        return 0;
    }
    
    printf("Father: write\n");
    write(event_fd, &value, sizeof(value));
    
    printf("Father: wait child exit\n");
    
    waitpid(ret, &status, 0);    

    close(event_fd);
    return 0;
}

輸出結果:

event_fd=3
Father: write
Father: wait child exit
Child: wait events ... times: 0
epoll in is 5
Child: wait events ... times: 1
epoll out is 4
Child: exit

2. eventfd初始爲值爲0的例子

#include <stdio.h>
#include <sys/eventfd.h>
#include <sys/epoll.h>
#include <memory.h>

int main()
{
    int event_fd = eventfd(0, EFD_NONBLOCK);

    /* epoll */
    int epfd = 0;
    struct epoll_event epevent[1], poolevent;
    printf("event_fd=%d\n", event_fd);

    epfd = epoll_create(1);
    if (epfd == -1) {
    printf("\nepoll_create, failed\n");
        return -1;
    }    

    poolevent.events = EPOLLOUT | EPOLLIN | EPOLLET;
    poolevent.data.fd = event_fd;

    int ret = epoll_ctl(epfd, EPOLL_CTL_ADD, event_fd, &poolevent);
    if (ret != 0)
    {
        printf("\nepoll_ctl, failed\n");
        close(epfd);
        return -1;
    }

    epoll_wait(epfd, epevent, 1, -1); // here to monitor only 1 event(epevent), so the third parameter is 1
    if((epevent[0].events & EPOLLIN))
    {
        fprintf (stderr, "epoll in is %d\n", epevent[0].events);
    }
    else if((epevent[0].events & EPOLLOUT))
    {
        fprintf (stderr, "epoll out is %d\n", epevent[0].events);
    }
    else
    {
        fprintf (stderr, "epoll unknown events %d\n", epevent[0].events);
        close (epevent[0].data.fd);
        return(1);
    }
    
    close(epfd);
    
    close(event_fd);
    return 0;
}

輸出結果:
event_fd=3
epoll out is 4

3. eventfd初始值爲1的狀況

#include <stdio.h>
#include <sys/eventfd.h>
#include <sys/epoll.h>
#include <memory.h>

int main()
{
    int event_fd = eventfd(1, EFD_NONBLOCK);

    /* epoll */
    int epfd = 0;
    struct epoll_event epevent[1], poolevent;
    printf("event_fd=%d\n", event_fd);

    epfd = epoll_create(1);
    if (epfd == -1) {
    printf("\nepoll_create, failed\n");
        return -1;
    }    

    poolevent.events = EPOLLOUT | EPOLLIN | EPOLLET;
    poolevent.data.fd = event_fd;

    int ret = epoll_ctl(epfd, EPOLL_CTL_ADD, event_fd, &poolevent);
    if (ret != 0)
    {
        printf("\nepoll_ctl, failed\n");
        close(epfd);
        return -1;
    }

    epoll_wait(epfd, epevent, 1, -1); // here to monitor only 1 event(epevent), so the third parameter is 1
    if((epevent[0].events & EPOLLIN))
    {
        fprintf (stderr, "epoll in is %d\n", epevent[0].events);
    }
    else if((epevent[0].events & EPOLLOUT))
    {
        fprintf (stderr, "epoll out is %d\n", epevent[0].events);
    }
    else
    {
        fprintf (stderr, "epoll unknown events %d\n", epevent[0].events);
        close (epevent[0].data.fd);
        return(1);
    }
    
    close(epfd);
    
    close(event_fd);
    return 0;
}

輸出結果: event_fd=3 epoll in is 5

相關文章
相關標籤/搜索