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