文件描述符轮询

时间:2010-08-03 10:42:26

标签: c linux unix polling

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

#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文件) 请帮忙

2 个答案:

答案 0 :(得分:4)

poll()实际上对打开的文件无效。由于文件上的read()永远不会阻止,poll()将始终返回,您可以从文件中读取非阻塞。

这将(几乎)对字符设备*,命名管道**或套接字起作用,因为当没有数据可用时,read()会阻止它们。 (你还需要实际读取那些数据,否则民意调查会一次又一次地说明数据是否可用)

要“轮询”正在增长/缩小的文件,请参阅man inotify或在循环中使用fstat()实施您自己的投票。

*块设备是一个分开的故事;从技术上讲,从硬盘读取可以阻止10毫秒或更长时间,这不会被视为阻止Linux中的I / O.
**另见how to flush a named pipe using bash

答案 1 :(得分:1)

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