2012-08-24 2 views
3

it_intervalnewValue으로 사용하여 시간 초과 간격을 설정하고 싶습니다.
그러나이 예에서는 timeout번만 번만 인쇄 할 수 있습니다.
무슨 일이 있었습니까? 간격을 어떻게 설정할 수 있습니까? 당신이 TFD에 생성 된 데이터를 보내고) EPOLLET를 사용 (읽기되지 않기 때문에epoll with timerfd

int main() 
{ 
int efd =epoll_create(256);    
setnonblock(efd); 
struct epoll_event ev,events[256]; 

int tfd;//timer fd 

if((tfd= timerfd_create(CLOCK_MONOTONIC,TFD_NONBLOCK)) < 0) 
    cout<<"timerfd create error"<<endl; 

struct itimerspec newValue; 
struct itimerspec oldValue; 
bzero(&newValue,sizeof(newValue)); 
bzero(&oldValue,sizeof(oldValue)); 
struct timespec ts; 
ts.tv_sec = 5; 
ts.tv_nsec = 0; 

    //both interval and value have been set 
    newValue.it_value = ts; 
    newValue.it_interval = ts; 
    if(timerfd_settime(tfd,0,&newValue,&oldValue) <0) 
    { 
     cout<<"settime error"<<strerror(errno)<<endl; 
    } 

    ev.data.fd = tfd; 
    ev.events = EPOLLIN | EPOLLET; 

    if(epoll_ctl(efd,EPOLL_CTL_ADD,tfd,&ev) < 0) 
     cout<<"epoll_ctl error"<<endl; 

    int num = 0; 
    while(1) 
    { 
     if((num=epoll_wait(efd,events,256,1000)) > 0) 
     {//justice 
      for(int i=0;i<num;i++) 
      { 
       if(events[i].data.fd == tfd) 
       { 
        cout<<"timeout"<<endl; 
       } 
     }  
    } 
    } 
return 0; 
} 

답변

16

그것은이다

이 내 코드입니다. 타이머가 만료되면 읽을 필요가있는 8 바이트의 데이터를 "씁니다": 실제로 읽어야합니다. 당신이 "타임 아웃"을 인쇄 할 때이 추가 :

uint64_t value; 
read(tfd, &value, 8); 

더 많은 세부 정보 : EPOLLET은 가장자리에 epoll_wait()는 당신이 때까지 파일 descritor의 TFD의 "데이터 입력을위한 준비가"한 번만 말할 것이다 즉, 트리거 요청 그 데이터를 읽으십시오. 즉, 그 데이터를 읽지 않는 한 epoll_wait()에 대한 이후의 호출은 동일한 설명자를 다시 반환하지 않습니다. 이 동작은 일반적인 소켓에서 유용합니다. 주 스레드에서 epoll_wait()을 수행하면 일부 데이터가 준비되었음을 확인한 다음 다른 스레드를 실행하여 읽습니다. 주 스레드는 즉시 epoll_wait()로 돌아갑니다. 하지만 파일 설명자의 데이터가 아직 읽지 않은 경우에도 즉시 다시 시작하지 않으려합니다.

EPOLLET을 사용하지 않은 경우에도 read()가 없기 때문에 tfd가 초기 지연 후 항상 읽을 수 있으므로 최대한 빨리 "timeout"이 인쇄됩니다. 초기 지연이 만료 된 후

+3

+1 ET 이벤트에 대한 평신도 설명 : ') – amc