linux程序 執行緒協作 之 epoll

2021-07-30 21:22:00 字數 2704 閱讀 3756

typedef

union epoll_data epoll_data_t;

struct epoll_event ;

/*events可以是以下幾個巨集的集合:

epollin :表示對應的檔案描述符可以讀(包括對端socket正常關閉);

epollout:表示對應的檔案描述符可以寫;

epollpri:表示對應的檔案描述符有緊急的資料可讀(這裡應該表示有帶外資料到來);

epollerr:表示對應的檔案描述符發生錯誤;

epollhup:表示對應的檔案描述符被結束通話;

epollet: 將epoll設為邊緣觸發(edge triggered)模式,這是相對於水平觸發(level triggered)來說的。

epolloneshot:只監聽一次事件,當監聽完這次事件之後,如果還需要繼續監聽這個socket的話,需要再次把這個socket加入到epoll佇列裡

*/

#include 

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define maxline 5

#define open_max 100

#define listenq 20

#define serv_port 5000

#define inftim 1000

void setnonblocking(int sock)

opts = opts|o_nonblock;

if(fcntl(sock,f_setfl,opts)<0)

}int main(int argc, char* argv)

}else

//宣告epoll_event結構體的變數,ev用於註冊事件,陣列用於回傳要處理的事件

struct epoll_event ev,events[20];

//生成用於處理accept的epoll專用的檔案描述符

epfd=epoll_create(256);

struct sockaddr_in clientaddr;

struct sockaddr_in serveraddr;

listenfd = socket(af_inet, sock_stream, 0);

//把socket設定為非阻塞方式

//setnonblocking(listenfd);

//設定與要處理的事件相關的檔案描述符

ev.data.fd=listenfd;

//設定要處理的事件型別

ev.events=epollin|epollet;

//註冊epoll事件

epoll_ctl(epfd,epoll_ctl_add,listenfd,&ev);

bzero(&serveraddr, sizeof(serveraddr));

serveraddr.sin_family = af_inet;

char *local_addr="127.0.0.1";

inet_aton(local_addr,&(serveraddr.sin_addr));//htons(portnumber);

serveraddr.sin_port=htons(portnumber);

bind(listenfd,(sockaddr *)&serveraddr, sizeof(serveraddr));

listen(listenfd, listenq);

maxi = 0;

for ( ; ; )

//setnonblocking(connfd);

char *str = inet_ntoa(clientaddr.sin_addr);

cout << "accapt a connection from "

<< str << endl;

//設定用於讀操作的檔案描述符

ev.data.fd=connfd;

//設定用於注測的讀操作事件

ev.events=epollin|epollet;

//註冊ev

epoll_ctl(epfd,epoll_ctl_add,connfd,&ev);

}else

if(events[i].events&epollin)//如果是已經連線的使用者,並且收到資料,那麼進行讀入。

else

std::cout<<"readline error"

if (n == 0)

line[n] = '/0';

cout << "read "

<< line << endl;

//設定用於寫操作的檔案描述符

ev.data.fd=sockfd;

//設定用於注測的寫操作事件

ev.events=epollout|epollet;

//修改sockfd上要處理的事件為epollout

//epoll_ctl(epfd,epoll_ctl_mod,sockfd,&ev);

}else

if(events[i].events&epollout) // 如果有資料傳送}}

return

0;}

linux之程序執行緒

1.pid唯一描述乙個程序 getpid 函式返回程序id號,getppid返回其父程序的id號 返回型別為pid t型 通過typedef定義為unsigned int 2.fork 函式 以父程序為藍本複製乙個程序,執行一次返回兩次。標頭檔案 include,include 返回 1建立失敗 返...

Linux併發(多執行緒協作)

乙個程式裡的執行緒數,就像一家公司裡的員工數一樣,太少了忙不過來,太多了入不敷出。因此我們需要有更好的機制來協調它們。拓展 最理想的情況是 讓程序有一些初始數目的執行緒 所謂的執行緒池 當沒有任務的時候這些執行緒自動進入睡眠,有了任務他們會立即執行任務,不斷迴圈。程序還應該可以根據自身任務的繁重與否...

linux程序和執行緒

這兩天一直在看linxu程序和執行緒的東西,總是效率比較低,這麼一點基礎的東西還看了這麼久。該自我反省一下。首先來看看程序。程序分為三個部分,程序控制塊,程式段和資料段。程序是乙個有生命的實體,程式是乙個沒有生命的實體。只有cpu賦予程式生命的時候,程式才成為乙個活動的實體,我們稱之為 程序 每乙個...