「混合」ファイル記述子/ソケットのクローズ/クリーンアップ
-
01-07-2019 - |
質問
accept() を使用してソケットを作成し、fdopen() を使用してそこからファイルを作成する場合、すべてをクリーンアップするにはどうすればよいですか?ファイルに対して fclose() を実行する必要がありますか、ソケットに対して shutdown() と close() を実行する必要がありますか、それとも shutdown() と close() または fclose() のみを実行する必要がありますか?fclose() を実行しない場合、FILE ポインタを手動で free() する必要がありますか?
解決
fdopen 氏より:
ファイル記述子は複製されず、fdopen() によって作成されたストリームが閉じられると閉じられます。
したがって、私は fclose() を使用するだけで、基礎となるファイル記述子も閉じます。shutdown() が必要かどうかもわかりません。
他のヒント
から http://opengroup.org/onlinepubs/007908775/xsh/fclose.html
fclose()関数は、ストリームによって指されたストリームに関連付けられているファイル記述子にclose()を実行します。
ソケットをストリームでラップした場合、少なくとも最初にストリームをフラッシュしない限り、shutdown() を実行することはおそらく意味がありません。しかし、それを誓うつもりはありません。単に close() ではなく shutdown() を使用する必要があるかどうかはわかりません。
ここでクリーンアップする必要があるものが 2 つあります。で表されるストリーム FILE
ソケットによって表されるファイル記述子。まずストリームを閉じてから、ファイル記述子を閉じる必要があります。したがって、一般的には次のことが必要になります。 fclose()
どれでも FILE
オブジェクト、その後 close()
任意のファイル記述子。
個人的には使ったことないけど shutdown()
自分の後片付けをしたいときなので言えません。
編集
他の人も正しく指摘しています fdclose()
また、基礎となるファイル記述子も閉じます。 close()
ファイル記述子を閉じるとエラーが発生します。この場合、必要なのは fdclose()
.