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賦予程式生命的時候,程式才成為乙個活動的實體,我們稱之為 程序 每乙個...