【Linux系统编程】IO多路复用之poll
生活随笔
收集整理的這篇文章主要介紹了
【Linux系统编程】IO多路复用之poll
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. poll函數
- 03. 程序示例
- 04. poll優缺點
- 05. 附錄
01. 概述
select() 和 poll() 系統調用的本質一樣,前者在 BSD UNIX 中引入的,后者在 System V 中引入的。poll() 的機制與 select() 類似,與 select() 在本質上沒有多大差別,管理多個描述符也是進行輪詢,根據描述符的狀態進行處理,但是 poll() 沒有最大文件描述符數量的限制(但是數量過大后性能也是會下降)。poll() 和 select() 同樣存在一個缺點就是,包含大量文件描述符的數組被整體復制于用戶態和內核的地址空間之間,而不論這些文件描述符是否就緒,它的開銷隨著文件描述符數量的增加而線性增大。
02. poll函數
#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout); 功能:監視并等待多個文件描述符的屬性變化 參數說明:pollfd -- 數組的地址nfds: 數組的最大長度, 數組中最后一個使用的元素下標+1§ 內核會輪詢檢測fd數組的每個文件描述符timeout:§ -1: 永久阻塞§ 0: 調用完成立即返回§ >0: 等待的時長毫秒 返回值: 成功時,poll() 返回結構體中 revents 域不為 0 的文件描述符個數;如果在超時前沒有任何事件發生,poll()返回 0;失敗時,poll() 返回 -1,并設置 errno 為下列值之一:EBADF:一個或多個結構體中指定的文件描述符無效。EFAULT:fds 指針指向的地址超出進程的地址空間。EINTR:請求的事件之前產生一個信號,調用可以重新發起。EINVAL:nfds 參數超出 PLIMIT_NOFILE 值。ENOMEM:可用內存不足,無法完成請求。 ? struct pollfd {int fd; /* 文件描述符 */short events; /* 等待的事件 */short revents; /* 實際發生的事件 */ };03. 程序示例
#include <poll.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>int main(int argc, char *argv[]) {int ret;int fd;struct pollfd fds[2]; // 監視文件描述符結構體,2 個元素ret = mkfifo("test_fifo", 0666); // 創建有名管道if(ret != 0){perror("mkfifo:");}fd = open("test_fifo", O_RDWR); // 讀寫方式打開管道if(fd < 0){perror("open fifo");return -1;}ret = 0;fds[0].fd = 0; // 標準輸入fds[1].fd = fd; // 有名管道fds[0].events = POLLIN; // 普通或優先級帶數據可讀fds[1].events = POLLIN; // 普通或優先級帶數據可讀while(1){// 監視并等待多個文件(標準輸入,有名管道)描述符的屬性變化(是否可讀)// 沒有屬性變化,這個函數會阻塞,直到有變化才往下執行,這里沒有設置超時ret = poll(fds, 2, -1);//ret = poll(&fd, 2, 1000);if(ret == -1){ // 出錯perror("poll()");}else if(ret > 0){ // 準備就緒的文件描述符char buf[100] = {0};if( ( fds[0].revents & POLLIN ) == POLLIN ){ // 標準輸入read(0, buf, sizeof(buf));printf("stdin buf = %s\n", buf);}else if( ( fds[1].revents & POLLIN ) == POLLIN ){ // 有名管道read(fd, buf, sizeof(buf));printf("fifo buf = %s\n", buf);}}else if(0 == ret){ // 超時printf("time out\n");}}return 0; }04. poll優缺點
select和poll對比, poll的優點如下
優點:
1).理論上支持無數個文件描述符
2).省去了內核檢查位圖的繁瑣操作
缺點:
1).每次調用都會出現一次從用戶空間到內核空間的拷貝
2).每次返回都會出現一次從內核空間到用戶空間的拷貝
3).返回后需要用戶依次掃描fds數組,因此會做很多沒必要的檢查
因此,poll函數會比select的效率稍微高一點
05. 附錄
總結
以上是生活随笔為你收集整理的【Linux系统编程】IO多路复用之poll的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux系统编程】IO多路复用之se
- 下一篇: 【Linux系统编程】IO多路复用之ep