10 事件
i/o 1
事件i/o
select
函式的侷限性
a)程序所能同時開啟的檔案描述符個數受
fd_setsize
大小的限制
b)每當
select
函式返回可用的檔案描述符集合後,應用都不得不對所有已
註冊的檔案描述符進行遍歷比對,以確定哪個描述符上發生了事件,從而對其進
行讀寫操作
2 要掌握的函式
epoll
通過三個系統呼叫完成了高效的
i/o
模型的實現
epoll_create
,初始化
epoll
上下文環境
epoll_ctl
,向epoll
上下文中新增或去除需要系統監視的檔案描述符
epoll_wait
,等待檔案描述符上發生事件
2.1 epoll_create
函式 int epoll_create (int size)
返回值:檔案描述符表示成功,
-1 表示錯誤,
errno
記錄錯誤號
例如:int epfd;
epfd = epoll_create (100);
if (epfd < 0)
perror ("epoll_create");
2.2 epoll_ctl
函式 /*
向epoll
環境中新增,刪除,改變要監視的檔案描述符
*/ int epoll_ctl (int epfd, int op, int fd,struct epoll_event *event);
返回值:
0 表示成功,
-1 表示錯誤,
errno
記錄錯誤號
呼叫引數:
epfd
,epoll_create
建立的epoll
環境控制代碼
op,規定對
fd 的操作方式
event
,事件
2.3
函式epoll_wait
#include
int epoll_wait (int epfd, struct epoll_event *events,int maxevents, int timeout);
返回值:發生事件的檔案描述符個數表示成功,
-1 表示錯誤,
errno
記錄錯誤號
3 程式的具體過程:
3.1
註冊檔案描述符到
epoll
struct epoll_event event;
int ret;
/* 將來epoll
會返回此
fd 給應用
*/ event.data.fd = fd;
/* 監視此fd
上的可讀和可寫事件*/
ret = epoll_ctl (epfd, epoll_ctl_add, fd, &event);
if (ret)
perror ("epoll_ctl");
3.2
修改epoll
監視事件
struct epoll_event event;
int ret;
/* 將來epoll
會返回此
fd 給應用
*/ event.data.fd = fd;
/* 監視此fd
上的可讀事件
*/ event.events = epollin;
ret = epoll_ctl (epfd, epoll_ctl_mod, fd, &event);
if (ret) perror ("epoll_ctl");
3.3
取消epoll
監視的檔案描述符
struct epoll_event event;
int ret;
ret = epoll_ctl (epfd, epoll_ctl_del, fd, &event);
if (ret) perror ("epoll_ctl");
3.4
等待epoll
事件發生,隨後變數
events
事件 int nr_events = epoll_wait (epfd, events, max_events, -1);
/* 對epoll
返回的nr_events
個事件依次遍歷,進行處理
*/ for (i = 0; i < nr_events; i++)
4 程式示例
#include
#include
#include
#include
#include
#include
#include
#include
#define bufsize 512
#define open_max 100
#define max_events 20
char buf[bufsize];
struct epoll_event events[max_events];
void setnonblocking(int sock)
; int main()
; listen(listenfd,20);
while(1)
; int i=0;
for(i=0;i
printf("servergotaconnection
%s:%d\r\n",inet_ntoa(cli.sin_addr),htons(cli.sin_port));
setnonblocking(confd);
ev.data.fd=confd;
ev.events==epollin|epollet;
epoll_ctl(efd,epoll_ctl_add,confd,&ev);
continue;
} if(events[i].events&epollin)
if(n<=0)
else
}//end of if
是e_pollin
}//end of for
}//end of while }
from
5 邊沿觸發
et 和水平觸發
lt 水平觸發模式下,以讀模式為例,只要被監視的套接字接收快取中有可讀資料,
epoll_wait
立刻返回。邊沿觸發,只有當套接字快取收到了資料時,
epoll_wait
才會返回,即使快取中還有上次沒有讀完的資料。
I O 標準 I O 實驗
一 測試標準 i o 一次可以同時開啟多少個檔案 1 實驗思路 利用迴圈同時開啟檔案,直到不能開啟 2 如下 二 fgetc 和 fputc 實現拷貝檔案並輸出檔案行數 1 實驗思路 開啟檔案,用 fgetc 讀取,然後 fputc 輸出 2 如下 三 fgetc 和 putchar 實現只輸出字母...
實驗九 I O流
實驗目的和要求 1 掌握格式化的輸入輸出方法。2 熟悉系統提供的輸入操作函式。3 掌握磁碟檔案的輸入輸出方法。實驗內容 1 程式sy9 1.cpp用以列印表中的資料,但程式中存在邏輯錯誤。上機除錯後寫出正確的 sy9 1.cpp include includeusing namespace std ...
實驗九 I O流
一 實驗目的和要求 1.掌握格式化的輸入輸出方法。2.熟悉系統提供的輸入操作函式。3.掌握磁碟檔案的輸入輸出方法。二 實驗內容 1.程式sy9 1.cpp用以列印表中的資料,但程式中存在邏輯錯誤。上機除錯後寫出正確的 cpp view plain copy print?include include...