2012-03-04 23 views
3

私はファイルを見たいと思っています。 今まで私はループする必要があります!eof、私はそれがCPU時間の無駄だと思います。Linux 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; 

}

iが選択、ときにファイルの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、彼はなぜ彼が 'select'を使うことができないのかを説明しようとしていると思います - 彼はデータがあるときを知りたいですが、' select'はEOFで目を覚ますでしょう。 – ugoren

+0

@ugoren:さて、彼はそれについて少し明確にする必要があります。とにかくファイルで何をしたいのかを '選択する 'とは思えません。それはパイプやソケットのためのものです。 – cHao

答えて

1

inotifyを サンプルコードの使用あなたはinotifyメカニズムを試すことができます。
inotify_add_watchを使用して、視聴したいファイルのIN_MODIFYイベントを聞きます。

+0

私はこれを得ます:http://www.ibm.com/developerworks/cn/linux/l-inotifynew/たくさん...〜 – Terry

+0

@Terry、あなたのリンクは私のための中国語のようです...しかし、あなたのために働くものは何でも。 – ugoren

関連する問題