tail head cat sleep
QR code linking to this page

manページ  — CLOSE

名称

close – 記述子を削除する

内容

ライブラリ

Standard C Library (libc, -lc)

書式

#include <unistd.h>

int
close(int d);

解説

close() システムコールはプロセスのオブジェクト参照テーブルから記述子を削除します。 これがそのオブジェクトへの最後の参照だった場合、 オブジェクトはアクティブでなくなります。 たとえば、ファイルに対する最後のクローズで、そのファイルに結び付けられた現在の seek ポインタは失われます。 socket(2) に対する最後のクローズで、そのソケットに結び付けられた 命名情報と待ち行列内のデータは破棄されます。 問合せ型ロックを保持している ファイルに対する最後のクローズで、ロックは解放されます (詳細は flock(2) を参照)。 しかし、System V と IEEE Std 1003.1-88 ("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)" 呼び出しはこれをデフォルトに戻します。 デフォルトでは、記述子はクローズされません。

戻り値

The close function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

エラー

close() システムコールは次の場合に失敗します:
[EBADF]
  d 引数がアクティブな記述子ではありません。
[EINTR]
  割り込みが受信されました。
[ENOSPC]
  下層のオブジェクトとサイズが合わず、キャッシュされたデータが失われました。

関連項目

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

規格

close() システムコールは IEEE Std 1003.1-90 ("POSIX.1") に適合しています。

歴史

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

CLOSE (2) April 19, 1994

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.

The last good thing written in C was Franz Schubert's Symphony #9.
— Erwin Dietrich