3-1. 基於epoll架構的視頻採集端設計

精通epoll架構數組

  epollLinux中最優秀的多路複用機制!架構

 

與select 、poll區別函數

1.select和poll沒有太大區別,除了select有文件描述符限制(1024個)。select每次調用都須要將fd集合拷貝到內核態,且監聽過程遍歷全部的文件位置,開銷很大。spa

2.Epoll監測無上限,在註冊新事件時就會一次性把全部fd拷貝到內核,無序遍歷便可查詢到監聽位置,提升效率。code

 

  優點:1)多路複用;  2)阻塞IO;  3)無需遍歷全部文件便可知道錯誤的文件位置(高效)  4)監控文件無上限視頻

多路複用一個進程同時監控多個文件或設備blog

阻塞IO   :進程執行過程當中,無命令處理時進程休眠,有命令待處理時,喚醒進程處理命令;(避免在無命令時進程忙等佔用CPU,高效)隊列

  epoll支持管道FIFO、套接字socket、POSIX消息隊列、終端等,但不支持普通文件。epoll分紅以下三個環節進程

建立epoll監聽池 epfd = epoll_create(50)            返回epfd指向建立的監聽池 
添加epoll監聽事件

epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event) 事件

            監聽池epfd  操做符  要監聽文件的fd  監聽結構類型

等待監聽事件發生 n = epoll_wait(epfd, events, 100, -1)     返回事件發生個數

 

 

 

 

 

 

 

 

 

 

 

int main() { int fd1,fd2,efd; struct epoll_event event; struct epoll_event *events; // 建立FIFO
    mkfifo("/tmp/fifo1",0666);    //要建立的FIFO文件的名字(含路徑) 
    mkfifo("/tmp/fifo2",0666); fd1=open("/tmp/fifo1",O_RDONLY);   //打開管道文件監聽
    fd2=open("/tmp/fifo2",O_RDONLY); //1. 建立監聽池
    efd = epoll_create1(0); //2. 構造監聽事件,加入監聽池
    event.events = EPOLLIN|EPOLLET;  //可讀 邊沿觸發
    event.data.fd = fd1;             //關注的文件
    epoll_ctl(efd,EPOLL_CTL_ADD,fd1,&event); /* 分別兩管道構造 */
    event.events = EPOLLIN|EPOLLET;  //可讀
    event.data.fd = fd2;             //關注的文件
    epoll_ctl(efd,EPOLL_CTL_ADD,fd2,&event); //添加事件到監聽池 //3. 等待事件的發生
    events = calloc(100,sizeof event);       //保存事件的數組
    n=epoll_wait(efd,events,100,-1); for(i=0;i<n;i++) { if(events[i].events&EPOLLIN) { read(events[i].data.fd,&c,1); printf("file %d can be read\n",events[i].data.fd); } } free(events); close(fd1); close(fd2);//關閉打開的文件+釋放申請的堆內存 }

 

檢測:分別編寫程序,向兩個管道文件內寫入數據,編譯運行 -> epoll當即檢測到事件發生。

----------------------------------------------------------------------------------------------------------

epoll架構加入攝像頭採集端,監聽攝像頭是否採集到數據(應用用途

   建立基本的監聽架構,將攝像頭採集端做爲監聽事件,添加至監聽池,當監聽到攝像頭捕捉到圖像文件時,即自動觸發啓動對應的處理函數,將獲取到圖片數據發送至顯示子系統,添加移植至GTK程序便可實現視頻採集播放

相關文章
相關標籤/搜索