kyleqian3008 发表于 2013-08-03 07:53

inotify和select一起使用,但是select一直阻塞!请问是否用法不对?

程序是这样的(监视两个日志文件的改变):
int fd = inotify_init();
fd_set rfds;
FD_ZERO(&rfds);

int ld1 = inotify_add_watch(fd, file_name1, IN_MODIFY);
FD_SET(ld1, &rfds);

int ld2 = inotify_add_watch(fd, file_name2, IN_MODIFY);
FD_SET(ld2, &rfds);

int nfds = 2;
while (true) {
        if (nfds == 0) {
                LOG_ERROR("No log notify fd need be monitored.");
                break;
        }
        int retval = select(nfds, &rfds, NULL, NULL, NULL);
      if (retval == -1) {
                PLOG_ERROR("select for log file");
                return EXIT_FAILURE;
        }
      int rfd = FD_ISSET(ld1, &rfds) ? ld1 : ld2;
        char buffer = {0};
        int length = read(rfd, buffer, EVTBUF_LEN);
      .......
}
但是执行过程中发现日志文件虽然在改变,但是select函数一直阻塞,不返回。如果不使用select,直接read两个inotify watch,是能够读取到文件改变事件的。
请问下这是怎么回事?是我的用法不对吗?

linux_c_py_php 发表于 2013-08-03 11:23

每次进入select之前都要重新设置一下各个set, 不过貌似不是这种问题.

kyleqian3008 发表于 2013-08-03 13:53

实在不好意思,是我没有搞清楚,犯了一个大错误……
select的中的文件描述符不应该是watch,而是inotify_init()返回的值……汗……

djsxut 发表于 2013-08-04 20:30

select 的第一个参数是所有文件描述符的最大值加1, 并且每次都要重设监视集。
页: [1]
查看完整版本: inotify和select一起使用,但是select一直阻塞!请问是否用法不对?