質問

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().

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top