2

socketfdBSDソケットでclose()を複数回呼び出すのは安全ですか?

4

2 に答える 2

3

マニュアルから:

close()成功するとゼロを返します。エラーの場合、-1が返され、errno適切に設定されます。

エラー

  EBADF  fd isn’t a valid open file descriptor.

したがってclose、上記のエラーで呼び出しが失敗するのは当然のことです。(これは確かに私のマシンで起こることです。)

于 2012-09-17T16:52:39.767 に答える
1

他の人が述べているようにEBADF、ファイル記述子が最初のクローズ後に何にも(再)使用されていない場合は、を取得します。

fdを閉じた後、無効な番号をfdに割り当てるのが一般的な方法です。使用する一般的なイディオム

 close(fd);
 fd = -1;

使用するイディオムである必要があります。このように、ソケットを再度閉じると、サイレントEBADFになり、新しく割り当てられた有効なファイル記述子の状態が損なわれることはありません。

(「無効なファイルハンドル」の値は、他のプラットフォームでは異なる場合があることに注意してください。つまり、Windows(?);ただし、POSIXシステムでは機能するはずです)。

于 2012-09-19T16:08:36.117 に答える