14

特定の fdのerrnowhenを調べる方法はありepoll_waitますか?EPOLLERR

エラーの性質に関する詳細情報はありますか?

編集:

あいまいさを防ぐために情報を追加する

epoll_wait多数のファイル記述子を待機します。呼び出すときは、構造体epoll_waitの配列を渡します。epoll_event

struct epoll_event {
           uint32_t     events;    /* Epoll events */
           epoll_data_t data;      /* User data variable */
       };

構造体には、ファイル記述子を epoll に追加するためにepoll_data_t使用したものと同じ詳細があります。epoll_ctl

typedef union epoll_data {
           void    *ptr;
           int      fd;
           uint32_t u32;
           uint64_t u64;
       } epoll_data_t;

私が探しているのは、epoll が待機しているファイル記述子の 1 つでエラーが発生した場合に何が起こるかです。

すなわち: (epoll_event.events & EPOLLERR) == 1- ファイル記述子のエラーの詳細を調べる方法はありますか?

4

4 に答える 4

20

getsockopt と SO_ERROR を使用して、ソケットで保留中のエラーを取得します。

int       error = 0;
socklen_t errlen = sizeof(error);
if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *)&error, &errlen) == 0)
{
    printf("error = %s\n", strerror(error));
}
于 2013-03-21T07:30:06.230 に答える
0

ちょっとしたポイント: 2 つの理由で、テストは正しく動作しません。EPOLLERR がたとえば 0x8 として定義されている場合、テストは 8 と 1 を比較し (== は & よりも優先順位が高いため)、0 を返し、それをイベント マスクと AND します。

必要なのは: (epoll_event.events & EPOLLERR) != 0 で、EPOLLERR ビットが設定されているかどうかをテストします。

于 2013-06-26T19:10:22.770 に答える
-2

epoll_wait は、エラーが発生すると -1 を返し、errno を適切に設定します。詳細については、「man 2 epoll_wait」を参照してください。

于 2012-10-31T05:14:50.530 に答える
-4

errno.h をインクルードし、perror を使用してエラー メッセージを表示します。基本的に、エラーは epfd または割り込みによるものであり、セット内のファイル記述子からは発生しません。

「errno.h」を含める

if(epoll_wait() == -1)
    {
      perror("Epoll error : ");
    }
于 2012-10-31T08:41:02.107 に答える