2012-03-04 2 views
3

리눅스에서 eof가 아닌 파일 fd가 읽기 쉽도록하고 싶습니다. c. 지금까지 반복해야합니다! eof, 나는 그것이 CPU 시간 낭비라고 생각합니다.리눅스 C! eof 이벤트를받는 방법?

static int rs_eof_read_binlog(rs_master_info_t *m, void *buf, 
    size_t size) { 

FILE *fp; 
size_t n; 

fp = m->bfp; 
for(;;) { 
    n = fread(buf, size, 1, fp); 
    if(n * size < size) { 
     if(ferror(fp) != 0) { 
      return RS_ERR; 
     } 

     if(feof(fp) != 0) { 
      fseek(fp, -n * size, SEEK_CUR); 
      sleep(1); 
     } 
    } 
    else { 
     break; 
    } 
} 

clearerr(fp); 
return RS_OK; 

은}

가 나는 경우 파일의 EOF를 선택 반환, 선택 checkd.

Those listed in readfds will be watched to see if characters become avail‐ 
    able for reading (more precisely, to see if a read will not block; in particular, a file descriptor is also ready on end-of-file) 

고정 !!!! 샘플 코드 사용

int main(int argc, char *argv[]) 

{

char p, buf[1024]; 
int fd = open("/home/terry/1.txt", O_RDONLY, "00666"); 
struct inotify_event * event; 
size_t len; 

read(fd, &p, 1); 

int ifd = inotify_init(); 
int wd = inotify_add_watch(ifd, "/home/terry/1.txt", IN_MODIFY); 
while(len = read(ifd, buf, 1024)) { 
    event = (struct inotify_event *) buf; 
    if(event->mask & IN_MODIFY) { 
     printf("changed\n"); 
     break; 
    } 
} 



return 0; 

}

+1

이 코드의 어디에서나'select'를 사용하지 않고 fd_set을 사용하지 않는다고 생각하면'man select'에서 읽은 내용이 모두 적용된다고 생각합니까? – cHao

+0

@cHao, 그가 왜 '선택'을 사용할 수 없는지 설명하려고합니다. 그는 데이터가 언제 있는지 알고 싶어하지만 '선택'을 선택하면 EOF에서 깨울 것입니다. – ugoren

+0

@ugoren : 그럼, 그는 그것에 대해 좀 더 명확해야합니다. 나는'선택'이 파일에서 원하는 것을 할 것이라고 확신하지 못한다. 이것은 파이프와 소켓에 더 많은 것을 의미한다. – cHao

답변

1

inotify를 당신은 inotify 메커니즘을 시도 할 수 있습니다.
inotify_add_watch을 사용하여보고 싶은 파일에서 IN_MODIFY 이벤트를 청취하십시오.

+0

나는 이것을 얻는다 : http://www.ibm.com/developerworks/cn/linux/l-inotifynew/ 많이 thks ... ~ – Terry

+0

@Terry, 당신의 연결은 나를 위해 중국어와 같다. .. 그러나. 당신을 위해 무슨 일이든. – ugoren

관련 문제