Firefox中可能存在的错误 - https://bugzilla.mozilla.org/show_bug.cgi?id=1288293
我正在编写一个inotify文件观察器。
我的主线程首先使用pipe
创建一个管道,然后创建一个轮询线程,并将该线程发送到管道的读取fd
。
int mypipe[2];
rez = pipe(mypipe)
if (pipe(pipefd) == -1) {
exit(EXIT_FAILURE);
}
int mypipe_fd = mypipe[0];
我的投票主题然后通过观察inotify inotify_fd
和mypipe_fd
poll
这样的管道开始无限投票:
int inotify_fd = inotify_init1(0);
if (inotify_fd == -1) {
exit('inotify init failed');
}
// IN_ALL_EVENTS = IN_ACCESS | IN_MODIFY | IN_ATTRIB | CONST.IN_CLOSE_WRITE | IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | IN_MOVED_TO | IN_CREATE | IN_DELETE | IN_DELETE_SELF | IN_MOVE_SELF
if (inotify_add_watch(inotify_fd, path_to_desktop, IN_ALL_EVENTS) == -1) {
exit('add watch failed');
}
int mypipe_fd = BLAH; // this the read end of the pipe generated on the main thread
pollfd fds[2];
fds[0].fd = mypipe_fd;
fds[1].fd = inotify_fd;
fds[0].events = POLLIN;
fds[1].events = POLLIN;
if (poll(fds, 2, -1) == -1) {
exit(errno);
}
退出时poll
无休止地-1
和errno
4
。 select
与fd
或两者兼而有之的情况相同。
我做了更多测试。即使只是read(mypipe_fd, .., ..)
或read(inotify_fd, .., ..)
,也会给我EINTR
。令人难以置信!有谁知道这可能导致什么?在Ubuntu 14.01和OpenSUSE 42.1(我测试过的那些)上可以看到这种行为。