實驗10 事件I O

2021-09-21 16:56:10 字數 3402 閱讀 9000

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...