poll(2)读取管道(2)的fd和inotify_init()的fd导致无尽的EINTR

时间:2016-07-19 11:08:12

标签: linux pipe jsctypes

更新

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_fdmypipe_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无休止地-1errno 4selectfd或两者兼而有之的情况相同。

我做了更多测试。即使只是read(mypipe_fd, .., ..)read(inotify_fd, .., ..),也会给我EINTR。令人难以置信!有谁知道这可能导致什么?在Ubuntu 14.01和OpenSUSE 42.1(我测试过的那些)上可以看到这种行为。

0 个答案:

没有答案