23

fdで2回連続して閉じるとどうなるか知りたいだけです。

例えば-

close(fd);
close(fd);

[fd は int です]

4

5 に答える 5

22

最初の呼び出しは0;を返す必要があります。2 番目の呼び出しは を返し-1、 に設定errnoする必要がありEBADFます。

2 番目の呼び出しが発生しないようにする必要があります。たとえば、の最初の呼び出しの直後fdなど、既知の不正な番号に設定し、その後 2 番目の呼び出しを行う前に確認します (2 番目の呼び出しを行う場合は呼び出しを行いません)。-1closefdfd-1

close(fd);
fd = -1;
...
// More code
...
if (fd != -1) {
    close(fd)
    fd = -1;
}

このコード パターンはclose、複数の場所から を呼び出す必要があるが、ファイルが開いているかどうか、または既に閉じられているかどうかがわからない場合に役立ちます。に渡す-1ことcloseは無害です (EBADFもちろん、 が返されます)。

于 2012-10-08T13:32:17.303 に答える
9

スレッド化されているか、閉じるための 2 つの呼び出しの間に何かをしている場合を除き、無害である必要があります。次に、プログラム内の他の何かが開いた fd を閉じることになる場合があります。

スレッド化が関連する方法は、ほとんどの場合、ライブラリが背後で奇妙なことを行うことです。libc はエラー メッセージやその他のロケール依存のものを検索するためにファイルを開き、リゾルバーは構成ファイルなどを開くことができます。ファイル記述子を閉じて再度閉じると、スレッド化された環境では、ファイルが記述子がライブラリによって再利用されており、背後で閉じています。

于 2012-10-08T13:30:13.687 に答える
5

Errno: EBADFそれまでにfdはアクティブなファイル記述子ではないため、 2番目の呼び出しはで失敗します。

実行にはまったく影響がないはずです。ただし、最初のクローズでエラー番号が設定された場合、それは失われるため、ファイル記述子を2回クローズしないでください。

于 2012-10-08T13:33:41.377 に答える
1

fd の値が同じままである場合、2 番目の呼び出しは fd が無効であるというエラーを返します (EBADF - dasblinkenlight が指摘したように)

何かをすることを考えてみてください。

if fd != -1 )
{
   close (fd );
   fd = -1;
}
于 2012-10-08T13:31:57.510 に答える