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

4

2 回答 2

7

poll()实际上不适用于打开的文件。由于read()文件上的 a 永远不会阻塞,poll()因此将始终返回您可以从文件中读取非阻塞。

不过,这(几乎)可以在字符设备*、命名管道**或套接字上工作,因为read()当没有可用数据时,这些设备会阻塞。(然后您还需要实际读取该数据,否则 poll 会一次又一次地告诉数据可用)

要“轮询”一个增长/缩小的文件,请查看或使用循环man inotify实现您自己的轮询。fstat()

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

于 2010-08-03T11:17:15.883 回答
1

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

于 2010-08-03T16:11:02.997 回答