8

マンページは、poll(2) について次のように述べています。

POLLHUP - 電話を切る (出力のみ)

POLLNVAL - 無効な要求: fd が開いていません (出力のみ)

違いは正確には何ですか?ファイル記述子を閉じるとトリガーされる簡単なプログラムをPOLLNVAL作成し、閉じたfdから読み取ろうとします。ただし、を返す方法がわかりませんPOLLHUP

4

3 に答える 3

16

POLLNVALは と同等ですEBADF: ファイル記述子が実際には開いているファイルを参照していないことを意味しますclose。これは、プログラミング エラーの結果、またはファイル記述子が無効かどうかを意図的にクエリしようとした場合を除き、決して発生しません。ピアがネットワーク ソケットまたはパイプの終端を閉じるなどの外部条件によって、ファイル記述子がソケットまたはパイプの終端に閉じられることはありません。可能であれば、これは基本的にソケット/パイプ/などを使用するすべてのプログラムで大規模な脆弱性につながる.

POLLHUP一方、は、ファイル記述子が有効であることを示しますが、次のような状態であることを示します。

デバイスが切断されたか、パイプまたは FIFO が書き込み用に開いていた最後のプロセスによって閉じられました。一度設定されると、FIFO のハングアップ状態は、何らかのプロセスが書き込みのために FIFO を開くか、FIFO のすべての読み取り専用ファイル記述子が閉じられるまで持続します。このイベントと POLLOUT は相互に排他的です。ハングアップが発生した場合、ストリームを書き込み可能にすることはできません。ただし、このイベントと POLLIN、POLLRDNORM、POLLRDBAND、または POLLPRI は相互に排他的ではありません。このフラグは、revents ビットマスクでのみ有効です。イベントメンバーでは無視されます。

ソース: http://pubs.opengroup.org/onlinepubs/9699919799/functions/poll.html

を見たい場合はPOLLHUP、 を開きpipe、読み取り側を閉じて、 で書き込み側を照会しますpoll

于 2014-08-05T20:13:56.953 に答える
5

をトリガーするプログラムを作成することが目標である場合はPOLLHUP、パイプを開き、書き込み側を閉じてから読み取り側を ing するようなことを試してください ( http://www.greenend.org.uk/rjk/tech/poll()から変更されたコードpoll.html ):

#include <unistd.h>
#include <stdio.h>
#include <poll.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main(void)
{
    int p[2];
    struct pollfd ufd;

    if (pipe(p) < 0) {
        perror("pipe");
        return EXIT_FAILURE;
    }
    if (close(p[1]) < 0) { /* close the write fd */
        perror("close");
        return EXIT_FAILURE;
    }

    memset(&ufd, 0, sizeof ufd);
    ufd.fd = p[0]; /* poll the read fd after the write fd is closed */
    ufd.events = POLLIN;
    if (poll(&ufd, 1, 1000) < 0) {
        perror("poll");
        return EXIT_FAILURE;
    }

    switch(ufd.revents & (POLLIN|POLLHUP)) {
        case POLLIN: printf("POLLIN\n"); break;
        case POLLHUP: printf("POLLHUP\n"); break;
        case POLLIN|POLLHUP: printf("POLLIN|POLLHUP\n"); break;
        case POLLERR: printf("POLLERR\n"); break;
        default: printf("%#x\n", (unsigned)ufd.revents); break;
    }

    return EXIT_SUCCESS;
}

上記POLLHUPは私のためのプリントです。

于 2014-08-05T20:15:18.580 に答える
1

POLLNVALファイル記述子の値が無効であることを意味します。これは通常、プログラムのエラーを示しますが、ファイル記述子を閉じており、それ以降、記述子を再利用した可能性のあるファイルを開いていない場合は、poll戻ることに依存できます。POLLNVAL

POLLHUP基本的に、接続のもう一方の端にあるものが接続の端を閉じたことを意味します。POSIX では次のように説明されています。

デバイスが切断されました。このイベントと POLLOUT は相互に排他的です。ハングアップが発生した場合、ストリームを書き込み可能にすることはできません。

これは端末にとって十分明らかです: 端末がなくなった (SIGHUP を生成する同じイベント: モデム セッションが終了した、端末エミュレータ ウィンドウが閉じられたなど)。POLLHUP通常のファイルに対して送信されることはありません。パイプとソケットの場合は、依存します。Linux はPOLLHUP、パイプの書き込み側のプログラムがパイプを閉じたPOLLIN|POLLHUPときに設定し、ソケットのもう一方の端がソケットを閉じたときに設定しますがPOLLIN、ソケットのシャットダウンの場合のみです。最近の *BSDPOLLIN|POLLUPは、パイプの書き込み側がパイプを閉じるときに設定され、ソケットの動作はより可変的です。

を観察するPOLLHUPには、プログラムを端末から読み取らせ、端末を閉じます。または、Linux では、プログラムをパイプから読み取り、書き込み側を閉じます (例: sleep 1 | yourprogram)。

于 2014-08-05T20:26:54.980 に答える