为什么不只在写入文件时显示此消息(使用 poll C Linux 函数)?

dus*_*abo 5 c linux polling

我正在阅读有关 C 编程中的 poll 并构建了poll(2) 手册页中给出的应用程序。

这是示例:

#include<stdio.h>
#include <stropts.h>
#include <poll.h>
#include <fcntl.h>

int main() {

    struct pollfd fds[2];
    int timeout_msecs = -1;
    int ret;
    int i;

    /* Open STREAMS device. */
    fds[0].fd = open("/home/jeshwanth/mywork/poll/dev0", O_RDONLY);
    fds[1].fd = open("/home/jeshwanth/mywork/poll/dev1", O_RDONLY);
    fds[0].events = POLLOUT | POLLWRBAND;
    fds[1].events = POLLOUT | POLLWRBAND;

    while (1) {
        ret = poll(fds, 2, timeout_msecs);

        if (ret > 0) {
            /* An event on one of the fds has occurred. */
            for (i = 0; i < 2; i++) {
                if (fds[i].revents != 0) {
                    /* Priority data may be written on device number i. */
                    printf(
                            "Priority Data may be written on device number %d POLLWRBAND\n",
                            i);

                }
                if (fds[i].revents = !0) {
                    /* Data may be written on device number i. */
                    printf("Data may be written on device number %d POLLOUT\n",
                            i);
                }
                if (fds[i].revents = !0) {
                    /* A hangup has occurred on device number i. */
                    printf("A hangup has occurred on device number %d\n", i);

                }
            }
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意:dev0 和 dev1 是普通文件。当我运行程序时,如果 dev0 和 dev1 中没有发生任何事件,则会显示该消息。但是我期待当一些写入文件发生时,它才应该显示消息。我错了吗?

nin*_*alj 3

轮询输出准备情况并不意味着您会在发生某些输出时收到通知:这意味着当有可用的输出缓冲区空间时您会收到通知,以便您可以输出(但您仍然应该检查输出函数的返回值) . 缓冲区状态可能在轮询和输出之间发生变化;始终检查返回值)。

  • 使用传统的 *nix API 无法收到通知。在 Linux 上,您可以使用 inotify。为了更便携,您可以使用 FAM 或 gamin。 (2认同)