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,是能够读取到文件改变事件的。
请问下这是怎么回事?是我的用法不对吗? 每次进入select之前都要重新设置一下各个set, 不过貌似不是这种问题. 实在不好意思,是我没有搞清楚,犯了一个大错误……
select的中的文件描述符不应该是watch,而是inotify_init()返回的值……汗…… select 的第一个参数是所有文件描述符的最大值加1, 并且每次都要重设监视集。
页:
[1]