スポンサーリンク

CLOSE(2) FreeBSD システムコールマニュアル CLOSE(2)

名称

close − 記述子を削除する

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#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, FD_CLOEXEC)’’ 呼び出しが準備されています。これは execve が成功し た後で、記述子を閉じるように指示します。 ‘‘fcntl(d, F_SETFD, 0)’’ 呼び出 しはこれをデフォルトに戻します。デフォルトでは、記述子はクローズされませ ん。

戻り値

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

エラー

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

       [EBADF]

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

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

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

関連項目

accept(2), execve(2), fcntl(2), flock(2), open(2), pipe(2), socket(2), socketpair(2)

規格

close() システムコールは ISO/IEC 9945-1:1990 (‘‘POSIX.1’’) に適合していま す。

歴史

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

FreeBSD 10.0 April 19, 1994 FreeBSD 10.0

スポンサーリンク