5

私は C プログラミングで poll について読んでいて、poll(2) man pageにあるアプリケーションを作成しました。

次に例を示します。

#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;
}

注: dev0 と dev1 は通常のファイルです。プログラムを実行すると、dev0 と dev1 でイベントが発生していない場合、メッセージが表示されます。しかし、ファイルへの書き込みが発生したときにのみ、メッセージが表示されることを期待していました。私が間違っている?

4

3 に答える 3

3

出力の準備ができているかどうかをポーリングしても、何らかの出力が発生したときに通知されるわけではありません。つまり、出力できるように出力バッファー領域が利用可能になったときに通知されることを意味します (ただし、出力関数の戻り値を確認する必要があります)。 . ポーリングと出力の間でバッファの状態が変化している可能性があります; 常に戻り値を確認してください)。

于 2012-09-16T09:46:44.207 に答える
0

直し方のヒントをお伝えします。revents複数のビット フラグとして解釈されます。

/* check for priority write readiness */
if (fds[i].revents & POLLWRBAND) {
  printf("Priority Data may be written on device number %d POLLWRBAND\n", i);
}

/* check for write readiness */
if (fds[i].revents & POLLOUT) {
  printf("Data may be written on device number %d POLLOUT\n", i);
}

/* check for hang-up */
if (fds[i].revents & POLLHUP) {
  printf("A hangup has occurred on device number %d\n", i);
}
于 2012-09-16T06:16:56.897 に答える