2012-01-03 8 views
12

次のコードを仮定してください。 "sock"はepfdで指定されたepollファイル記述子で以前に登録されたTCPソケットのハンドルです。ソケットを閉じる前にepollからソケットを登録解除する必要はありますか?

epoll_ctl(epfd, EPOLL_CTL_DEL, sock, &ev); 
close(sock); 

ソケットが引き続き閉じられる場合は、まだepoll_ctlを呼び出す必要はありますか?または、ソケットを閉じた結果、ソケットが暗黙的に登録解除されますか? man pageから

答えて

22

:それは全てのepollから削除される可能性が

Q6は が自動的に設定ファイルディスクリプタをクローズするのでしょうか?

A6はい、ただし、次の点に注意してください。ファイル記述子は、オープンファイル記述(open(2)参照)への参照である です。 記述子はdup(2)、dup2(2)、fcntl(2)F_DUPFD、または forkを経由して複製されるたびに(2)、同じオープンファイル記述 を参照する新しいファイル・ディスクリプタが作成されます。開いているファイルの説明は、そのファイルを参照するすべてのファイル が閉じられるまで続きます。ファイルディスクリプタは、 を参照するすべてのファイルディスクリプタが閉じられている(またはディスクリプタがepoll_ctl(2)EPOLL_CTL_DELを使用して明示的に削除された場合)前に、epollから削除された です。この は、セットの一部であるファイル記述子が を閉じた後でも、同じ基本ファイル記述を参照する他のファイル 記述子が開いたままである場合、そのファイル記述子についてイベントが報告されることを意味します。

+0

ありがとうございました!私は "man epoll_ctl"、 "man epoll_create"という答えを探していましたが、 "man epoll"の要約のmanページは忘れていました。 – selbie

+0

だから誰もdup()で重複していないし、プロセスは分岐していない、あなたは大丈夫ですか? – MarkR

+0

はい、私はそれがうまくいっていると思います。 –

関連する問題