fdで2回連続して閉じるとどうなるか知りたいだけです。
例えば-
close(fd);
close(fd);
[fd は int です]
最初の呼び出しは0
;を返す必要があります。2 番目の呼び出しは を返し-1
、 に設定errno
する必要がありEBADF
ます。
2 番目の呼び出しが発生しないようにする必要があります。たとえば、の最初の呼び出しの直後fd
など、既知の不正な番号に設定し、その後 2 番目の呼び出しを行う前に確認します (2 番目の呼び出しを行う場合は呼び出しを行いません)。-1
close
fd
fd
-1
close(fd);
fd = -1;
...
// More code
...
if (fd != -1) {
close(fd)
fd = -1;
}
このコード パターンはclose
、複数の場所から を呼び出す必要があるが、ファイルが開いているかどうか、または既に閉じられているかどうかがわからない場合に役立ちます。に渡す-1
ことclose
は無害です (EBADF
もちろん、 が返されます)。
スレッド化されているか、閉じるための 2 つの呼び出しの間に何かをしている場合を除き、無害である必要があります。次に、プログラム内の他の何かが開いた fd を閉じることになる場合があります。
スレッド化が関連する方法は、ほとんどの場合、ライブラリが背後で奇妙なことを行うことです。libc はエラー メッセージやその他のロケール依存のものを検索するためにファイルを開き、リゾルバーは構成ファイルなどを開くことができます。ファイル記述子を閉じて再度閉じると、スレッド化された環境では、ファイルが記述子がライブラリによって再利用されており、背後で閉じています。
Errno: EBADF
それまでにfdはアクティブなファイル記述子ではないため、 2番目の呼び出しはで失敗します。
実行にはまったく影響がないはずです。ただし、最初のクローズでエラー番号が設定された場合、それは失われるため、ファイル記述子を2回クローズしないでください。
fd の値が同じままである場合、2 番目の呼び出しは fd が無効であるというエラーを返します (EBADF - dasblinkenlight が指摘したように)
何かをすることを考えてみてください。
if fd != -1 )
{
close (fd );
fd = -1;
}