文件描述符轮询

4

我创建了一个程序,希望在程序中轮询我打开的文件描述符。

#define FILE "help"

int main()
{
        int ret1;
        struct pollfd  fds[1];

        ret1 =  open(FILE, O_CREAT);

        fds[0].fd = ret1;
        fds[0].events = POLLIN;

        while(1)
        {
                poll(fds,1,-1);

                if (fds[0].revents & POLLIN)
                        printf("POLLING");
        }
        return 0;
}

代码进入了无限循环。我期望当文件发生某些操作时运行循环(该文件为ASCII文件)。 请帮忙解决。


从技术上讲,它确实是一个无限循环。它没有终止条件,也没有任何语句可以跳出循环。你的意思是循环执行得比你预期的要快吗? - Frerich Raabe
2个回答

7

poll() 实际上无法在打开的文件上工作。由于对文件的read()永远不会被阻塞,因此poll()将始终返回您可以从文件中读取非阻塞的内容。

这在字符设备*、命名管道**或套接字上(几乎)可以工作,因为当您从它们中的任何一个进行read()时,如果没有可用数据,它们将被阻塞。(然后您还需要实际读取该数据,否则poll将一遍又一遍地告诉您有数据可用)

要“轮询”增长/缩小的文件,请参见man inotify或使用循环中的fstat()实现自己的轮询。

* 块设备是另外一个故事;虽然从硬盘读取可能会阻塞10毫秒或更长时间,但在Linux中,这不会被视为阻塞I/O。
** 参见如何使用bash刷新命名管道


请问您能否解释一下“使用循环中的fstat()进行自己的轮询”的含义。 - Arpit
尝试使用命令 strace tail -f somefile - 它会休眠1秒钟,然后使用 fstat 检查文件是否增长。 - mvds

1
不知道这是否是您问题的原因(可能不是),但重新定义标准宏FILE是一个特别糟糕的想法。 您的编译器没有抱怨吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接