epoll의 수평 촉발과 가장자리 촉발은 무엇입니까?두 단락의 코드를 철저히 이해하다.

9947 단어 기초 지식
Edge trigger and level trigger of epoll

수평 트리거

  • 읽기 작업: 버퍼 내용이 비어 있지 않으면 LT 모드에서 읽기 완료로 돌아갑니다.
  • 쓰기 작업: 버퍼가 불만족스러우면 LT 모드는 쓰기 완료로 돌아갑니다.
  • #include 
    #include 
    #include 
    
    int main()
    {
         
        int epfd, nfds;
        char buf[256];
        struct epoll_event event, events[5];
        epfd = epoll_create(1);
        event.data.fd = STDIN_FILENO;
        event.events = EPOLLIN;  // LT     
        epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &event);
        while (1) {
         
            nfds = epoll_wait(epfd, events, 5, -1);
            int i;
            for (i = 0; i < nfds; ++i) {
         
                if (events[i].data.fd == STDIN_FILENO) {
         
                    read(STDIN_FILENO, buf, 1);
                    printf("hello world
    "
    ); } } } }

    결과:
    # ./a.out 
    a
    hello world
    hello world
    ab
    hello world
    hello world
    hello world
    abc
    hello world
    hello world
    hello world
    hello world
    

    테두리 트리거

  • 읽기 동작 (1) 버퍼가 읽을 수 없는 것에서 읽을 수 있는 것으로 바뀔 때, 즉 버퍼가 빈 것에서 빈 것으로 바뀔 때.(2) 새로운 데이터가 도착했을 때, 즉 버퍼에 읽을 데이터가 많아질 때.(3) 버퍼에 읽을 수 있는 데이터가 있고 해당 설명자에 대한 EPOLL 적용 프로세스CTL_MOD가 EPOLIN 이벤트를 수정할 때
  • 쓰기 동작 (1) 버퍼가 쓰기 불가능에서 쓰기 가능으로 바뀔 때.(2) 버퍼의 내용이 줄어들 때 오래된 데이터가 전송된다.(3) 버퍼에 쓸 공간이 있고 프로세스가 해당 설명자에 대해 EPOLLCTL_MOD가 EPOLLOUT 이벤트를 수정할 때
  • #include 
    #include 
    #include 
    
    int main()
    {
         
        int epfd, nfds;
        struct epoll_event event, events[5];
    	char buf[256];
    
        epfd = epoll_create(1);
        event.data.fd = STDIN_FILENO;
        event.events = EPOLLIN | EPOLLET;
        epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &event);
        while (1) {
         
            nfds = epoll_wait(epfd, events, 5, -1);
            int i;
            for (i = 0; i < nfds; ++i) {
         
                if (events[i].data.fd == STDIN_FILENO) {
         
    				read(STDIN_FILENO, buf, 1);
                    printf("hello world
    "
    ); } } } }

    결과:
    # ./a.out 
    a
    hello world
    ab
    hello world
    abc
    hello world
    

    좋은 웹페이지 즐겨찾기