close(2) FreeBSD 一般コマンドマニュアル

close

前のページ 上に戻る 次のページ

close




書式

     #include <unistd.h>

     int
     close(int d);


解説

     close() はプロセスのオブジェクト参照テーブルから記述子を削除します。これ
     がそのオブジェクトへの最後の参照だった場合、オブジェクトはアクティブでな
     くなります。たとえば、ファイルに対する最後のクローズで、そのファイルに結
     び付けられた現在の seek ポインタは失われます。 socket(2) に対する最後のク
     ローズで、そのソケットに結び付けられた命名情報と待ち行列内のデータは破棄
     されます。問合せ型ロックを保持しているファイルに対する最後のクローズで、
     ロックは開放されます (詳細は flock(2) を参照)。しかし、System V と IEEE
     Std 1003.1-1988 (``POSIX.1'') では、あるプロセスがファイルに対して保持し
     ているすべての fcntl(2) 問合せ型レコードロックは、そのファイルについての
     ファイル記述子の いずれかがそのプロセスによって閉じられるときに開放され
     る、と規定しています。

     プロセスが終了するとき、プロセスに結び付けられたファイル記述子はすべて解
     放されます。しかし、アクティブな記述子の個数にはプロセスごとに制限がある
     ので、大量のファイル記述子を処理するときは、 close() 関数呼び出しが便利で
     す。

     プロセスがフォークするとき (fork(2) 参照)、新しい子プロセスの記述子はすべ
     て、フォークの前に親プロセスの記述子が参照していたのと同じオブジェクトを
     参照します。次に、新しいプロセスが execve(2) で実行される場合、そのプロセ
     スは通常これらの記述子を継承します。ほとんどの記述子は execve(2) の前に
     dup2(2) で再配置されるか、 close() で削除されます。もし execve が失敗した
     場合にこれらの記述子が必要になるのであれば、execve が成功した場合にのみ、
     それらをクローズするようにする必要があります。このために、 ``fcntl(d,
     F_SETFD, 1)'' 呼び出しが準備されています。これは execve が成功した後で、
     記述子を閉じるように指示します。 ``fcntl(d, F_SETFD, 0)'' 呼び出しはこれ
     をデフォルトに戻します。デフォルトでは、記述子はクローズされません。


実装に関する注

     非スレッドライブラリでは、 close() は close システムコールとして実装され
     ています。

     スレッドライブラリでは、 close システムコールは、 _thread_sys_close() に
     アセンブルされ、 close() は、読み書きについて d をロックしてから、
     _thread_sys_close() を呼び出す関数として実装されています。戻る前に、
     close() は d をアンロックします。


戻り値

     関数 close() は、処理が成功すると値 0 を返します。そうでない場合、値 -1
     が返され、グローバル変数 errno が設定されてエラーを示します。


エラー

     close() は次の場合に失敗します:

FreeBSD 4.4                     April 19, 1994                     FreeBSD 4.4

ABELNET VPSサービス