【问题标题】:file descriptor polling文件描述符轮询
【发布时间】:2010-08-03 10:42:25
【问题描述】:

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

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

【问题讨论】:

  • 从技术上讲,它一个无限循环。它没有终止条件,也没有跳出循环的语句。您的意思是循环执行的速度比您预期的要快吗?

标签: c linux unix polling


【解决方案1】:

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

这将(几乎)适用于字符设备*、命名管道** 或套接字,因为当您在没有可用数据时read() 时它们会阻塞。 (然后您还需要实际读取该数据,否则 poll 会一次又一次地告知数据可用)

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

* 块设备是另一回事;虽然从技术上讲,从硬盘读取可能会阻塞 10 毫秒或更长时间,但这在 linux 中不会被视为阻塞 I/O。
** 另见how to flush a named pipe using bash

【讨论】:

  • 您能否解释一下“您自己在循环中使用 fstat() 进行的轮询”。
  • 尝试strace tail -f somefile - 它只休眠 1 秒,然后使用 fstat 检查文件是否增长。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多