2012-10-31 13 views
8

特定のfdに対してepoll_waitEPOLLERRを返すときに、errnoを見つける方法はありますか?epoll_waitがEPOLLERRを返すときにerrnoを取得する方法は?

エラーの種類についての詳しい情報はありますか?

編集:

ファイル記述子の数に曖昧に

epoll_wait待機を防止するための追加情報を追加します。

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

epoll_data_t構造は、あなたがのepollにファイルディスクリプタを追加するためにepoll_ctlで使用したものと同じ内容を持っています:

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

何がepoll_wait呼び出すときはepoll_event構造体の配列は、それを渡します私が探しているのは、epollが待っているファイルディスクリプタの1つにエラーがある場合です。

ie:epoll_event.events & EPOLLERR == 1 - ファイルディスクリプタのエラーの詳細を調べる方法はありますか?

答えて

14

使用の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)); 
} 
+0

返事の遅れて申し訳ありません - これは完全に働きました - ありがとう! :) –

-1

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

+1

回答ありがとうございますが、@湖州省の回答に対する私のコメントからわかるように、これは私が探しているものではありません。 epollファイル記述子のepoll_waitが-1を返すと、エラーを得るためにerrnoを使うことができます。私が探しているのは、epollがepollが待っているファイルディスクリプタepoll_event.eventsとEPOLLERR == 1の場合です。 –

-4

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

はソケット上で保留中のエラーを取得するには、 "ERRNO.H"

if(epoll_wait() == -1) 
    { 
     perror("Epoll error : "); 
    } 
+0

レスポンスありがとうございますが、これは私が探しているものではありません。 epollファイル記述子のepoll_waitが-1を返すと、エラーを得るためにerrnoを使うことができます。私が探しているのは、epollが待っているファイルディスクリプタのうち、epoll_event.events&EPOLLERR == 1です。 –

+0

1.EBADF - epfdが有効なファイル記述子ではありません。 2.EFAULT - イベントによって示されたメモリ領域には書き込み権限がありません。 3.EINTR - 要求されたイベントが発生する前に、またはタイムアウトが切れる前に、シグナルハンドラによってコールが中断されました。 signal(7)を参照してください。 4。EINVAL - epfdがepollファイル記述子でないか、またはmaxeventsがゼロ以下です。 上記は男性の唯一の4つのエラーです。どのような状況下でEPOLLERR == 1でしょうか? –

+0

ソケットの場合、私はこのフラグを使用して閉じたピアをチェックします:EPOLLRDHUP。 –

0

だけマイナーポイント:あなたのテストをするために、正常に動作しません2つの理由。 EPOLLERRが0x8と定義されている場合、テストでは8と1が比較されます(==は&より優先順位が高いため)、0にしてからイベントマスクで検査します。

希望するものは:(epoll_event.events & EPOLLERR)!= EPOLLERRビットが設定されているかどうかをテストします。

+0

これはコメントではありませんでした答え – Matt

関連する問題