CLOSE(2)

名称
close - 記述子を削除する

ライブラリ
libc

書式
<unistd.h> int close(int d)

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

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

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

戻り値

エラー
close() システムコールは次の場合に失敗します:

[EBADF]
    d 引数がアクティブな記述子ではありません。

[EINTR]
    割り込みが受信されました。

[ENOSPC]
    下層のオブジェクトとサイズが合わず、キャッシュされたデータが失われました。

関連項目
accept(2), execve(2), fcntl(2), flock(2), open(2), pipe(2), socket(2), socketpair(2)

規格
close() システムコールは p1003.1-90 に適合しています。

歴史
close() 関数は AT&T UNIX で登場しました。