2012-02-17 11 views
4

epoll_ctl()を使用すると、第3引数 "fd"がepollファイル記述子 "epfd"以外のファイル記述子であることがわかりました。私が見たように、about epoll_ctl()

event.data.fd = sfd; //sfd is a fd for listening 
event.events = EPOLLIN | EPOLLET; 
s = epoll_ctl (efd, EPOLL_CTL_ADD, sfd, &event); 

event.data.fdでファイルディスクリプタがepoll_ctl第三パラメータと同じである、なぜ二度この記述子を渡す必要があります。そして、私はこのような例を見ましたか?何か違いはありますか?

+1

実装が割り当てを行っていないと考えられます。低レベルのCシステムコールは、プログラマに依存することがあります。このイベントは必ずしも必要ではありません。 EPOLL_CTL_DEL中にイベントは無視されますが、引数としてNULLポインタを与えることはできません。 –

答えて

10

実際には、には、event.data.fdを設定するがありません。それは組合で、他のメンバーを設定することができます。 epoll_waitリターンはあなたが面白いとなりましたディスクリプタに関連付けられevent.dataを取得する場合:意味

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

をあなたはfdには何も入れていない完全に自由だと(例えば)の代わりにptrに何かを置きます。

結論として、epoll_ctlは、fdを入力するという事実に依存することができません。そのため、別個の明示的なパラメータがあります。

+1

'epoll_ctl'に渡す' fd'は、イベントを取得したいファイル記述子です。 'event.data'の' fd'は厳密にあなたの使用のためです - システムはそれを無視し、あなたはどんな目的のためにも使用できます。 –

+0

@DavidSchwartzはい。そのため、 'epoll_data'は共用体です。 – cnicutar

+3

私は実際にepoll_data構造体にfdを入れるコードをたくさん見ました。そのソケットに関連付けられたアプリケーションの構造体へのポインタを保持するテーブルへのインデックスとしてそのfdを使用するだけです。 fd。明らかに、彼らは 'fd'の代わりに' ptr'メンバを使用してルックアップを保存することができないことを認識しませんでした。 –