Linux C如何获取!eof事件?

3

我希望在Linux C中观察文件fd是否可读,而不是EOF。现在我必须循环直到!eof,我认为这浪费了CPU时间。

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;

我检查了select,当文件结束时,select会返回。

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)

已修复! 使用inotify的示例代码

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
@cHao,我猜他试图解释为什么他不能使用select - 他想知道何时有数据,但select会在EOF时唤醒他。 - ugoren
@ugoren:那么,他需要更清楚地表达。我不确定select在文件上是否能实现他想要的功能——它更适用于管道和套接字。 - cHao
@cHao 我解释了为什么我不能使用select。 - Terry
@Terry:你并没有做得很好。我甚至不理解为什么你认为这是一个选项。只有在你想要阻塞直到FD准备就绪时才有用,而在这种情况下,你甚至不需要它来处理文件。对于EOF的文件读取将会读取0字节并设置EOF状态。 - cHao
@cHao 嗯,我认为当文件到达结尾时,select会被阻塞,直到文件被写入或被其他人访问。所以我尝试使用select,但是在查看了select的手册后,我发现即使文件到达结尾,select也会将FD设置为就绪状态...现在我打算使用inotify... - Terry
1个回答

1
你可以尝试使用inotify机制。
使用inotify_add_watch监听你想要观察的文件上的IN_MODIFY事件。

我收到了这个链接:http://www.ibm.com/developerworks/cn/linux/l-inotifynew/,非常感谢...~ - Terry
@Terry,你的链接对我来说就像中文一样……但是无论怎样都行。 - ugoren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接