Linux I/O多路轉接----poll模型

1.poll模型屬於I/O多路轉接模型,是對select模型的一種優化;

int  poll(struct pollfd *fds,nfd_t  nfds,int timeout);

2.poll的優點:

①poll使用數組存儲文件描述符,所以能描述的文件描述個數在理論上沒有上限;
 
②poll將輸入輸出型參數進行了分離,因此使用時不需要重新設置;

 ③不要求計算最大文件描述符加1的值,處理大數目文件描述符時比select的速度快;

3.poll的缺點:

①poll是系統調用,每次都要將文件描述符數字組從用戶態拷貝到內核態,開銷很大;

 ②雖然poll在理論上對描述的文件描述個數沒有上限,但每次調用poll,都要遍歷所有的文件描述符,當數量很多時,開銷很大,會降低性能和效率;

4.實現一個poll服務器,監控輸入:

#include<stdio.h>
#include<poll.h>


int main()
{
    struct pollfd evs;
    evs.fd=0;
    evs.events=POLLIN;//當關心多個事件時,使用|
    evs.revents=0;
    int timeout=3000;
    while(1)
    {
       switch(poll(&evs,1,timeout))
       {
          case -1:perror("poll");
                  break;
          case  0:printf("timeout...\n");
                  break;
          default:
          {//至少有一個數據就緒
               char buf[1024];
               if(evs.revents & POLLIN)
               {
                    ssize_t s=read(evs.fd,buf,sizeof(buf)-1);
                    if(s>0)
                    {//讀成功
                        buf[s]=0;
                        printf("echo#%s\n",buf);//回顯
                    }
               } 
          }
       }

  }    

 return 0;
}

結果如圖所示: 

  這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章