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)"
呼び出しはこれをデフォルトに戻します。
デフォルトでは、記述子はクローズされません。