2011-08-15 8 views
0

epollを使用して、コードまたはタイムアウトイベントの遅延実行をどのように作成しますか? libeventとlibevの両方に機能がありますが、epollを使ってこれを行う方法を理解できません。epollメインループを使用した遅延実行

は現在、メインループは次のようになります。

epoll_ctl(epfd, EPOLL_CTL_ADD, client_sock_fd, &epev); 

while(1) { 
    int nfds = epoll_wait(epfd, &epev, 1, 10); 
    if (nfds < 0) exit(EXIT_FAILURE); 
    if (nfds > 0) { 
     // If an event has been recieved 
    } 
    // Do this every 10ms 
} 

私は、この機能は、単に経過した時間を追加することなく、クリーンなソリューションのように思えるのepollを使用することによって達成することができることを十分に承知しています。

答えて

1

あなたはtimerfdを作成し、私はちょうどそれを行うのクリーナーのepollの道を求めていましたが、はい、これは私がそれを見るようにそれを行うための他の方法で書いたようにイベントがepoll_wait

+0

ありがとう、これは私が欲しかったものです! – Hobblin

-1

愚かな質問:なぜ明示的に時間を記録しないのですか?私は(ハートビートを送信するため)マルチTCPクライアントでこれを行うと、ループは基本的に行います。

uint64_t last = get_time_in_usec(); 
uint64_t event_interval = 10 * 1000; 
while(1) { 
    int nfds = epoll_wait(epfd, &epev, 1, 0); /* note that i set timeout = 0 */ 
    if (nfds <= 0) { /* do some cleanup logic, handle EAGAIN */ 
    if (nfds > 0) { /* If an event has been received */ } 
    if(get_time_in_usec() >= last + event_interval) { ... } 
} 

get_time_in_usecは、Linuxでgettimeofdayまたはrdtscを用いて実現することができます。 YMMV

+0

にファイルディスクリプタを追加することができます。合理的な時間内に他の人が投稿されていない場合、この回答を受け入れます。 – Hobblin

+0

私のポイントは、ループが0タイムアウトを持つ可能性があるということでした。 –

+2

この方法では、正当な理由がないためCPUを100%でロードします。あなたは眠りたいときに回転させるべきではありません。 –

関連する問題