免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2530 | 回复: 3
打印 上一主题 下一主题

[系统] inotify和select一起使用,但是select一直阻塞!请问是否用法不对? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-03 07:53 |只看该作者 |倒序浏览
程序是这样的(监视两个日志文件的改变):
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[EVTBUF_LEN] = {0};
        int length = read(rfd, buffer, EVTBUF_LEN);
        .......
}
但是执行过程中发现日志文件虽然在改变,但是select函数一直阻塞,不返回。如果不使用select,直接read两个inotify watch,是能够读取到文件改变事件的。
请问下这是怎么回事?是我的用法不对吗?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-08-03 11:23 |只看该作者
每次进入select之前都要重新设置一下各个set, 不过貌似不是这种问题.

论坛徽章:
0
3 [报告]
发表于 2013-08-03 13:53 |只看该作者
实在不好意思,是我没有搞清楚,犯了一个大错误……
select的中的文件描述符不应该是watch,而是inotify_init()返回的值……汗……

论坛徽章:
0
4 [报告]
发表于 2013-08-04 20:30 |只看该作者
select 的第一个参数是所有文件描述符的最大值加1, 并且每次都要重设监视集。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP