CLOSE(2) | FreeBSD System Calls Manual | CLOSE(2) |
名称
close — 記述子を削除するライブラリ
Standard C Library (libc, -lc)解説
close() システムコールは、プロセスごとのオブジェクト参照テーブルから記述子を削除します。これが、基本的なオブジェクトへの最後の参照であるなら、オブジェクトは、非アクティブにされます。例えば、ファイルの最後のクローズで、ファイルに関連付けられている現在の seek ポインタは、失われます。 socket(2) の最後のクローズで、関連した名前情報とキューに入れられたデータは、廃棄されます。アドバイザリ (advisory) ロックを保持しているファイルの最後のクローズで、ロックは、解放されます (さらに、 flock(2) を参照)。しかしながら、System V と IEEE Std 1003.1-1988 (“POSIX.1”) のセマンティックスは、与えられたプロセスのためのファイルに関連付けられたすべての fcntl(2) アドバイザリ (advisory) レコードロックが、そのファイルのための あらゆる ファイル記述子がそのプロセスによってクローズされるとき、削除されることを指示しています。プロセスが終了するとき、すべての関連するファイル記述子は、解放されますが、プロセスごとのアクティブな記述子に制限があるので、 close() システムコールは、大量のファイル記述子が操作されているとき、役に立ちます。
プロセスがフォークするとき ( fork(2) を参照)、新しい子プロセスのためのすべての記述子は、フォークの前に親プロセスにあったそれらと同じオブジェクトを参照します。次に、新しいプロセスが execve(2) を使用して実行されるなら、プロセスは、通常これらの記述子を継承します。 dup2(2) で再構成するか、または execve(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]
- fd 引数がアクティブな記述子ではありません。
- [ EINTR]
- 割り込みが受け付けられました。
- [ ENOSPC]
- 基本的なオブジェクトが適合せず、キャッシュされたデータが失われました。
- [ ECONNRESET]
- 基本的なオブジェクトが、すべての保留中 (pending) のデータが配信される前にピア (相手側) によってシャットダウンされたストリームソケットでした。
EBADF 以外の何らかのエラーの場合に、供給されたファイル記述子は、割り付け解放され、したがって、もはや有効ではありません。
関連項目
accept(2), closefrom(2), execve(2), fcntl(2), flock(2), open(2), pipe(2), socket(2), socketpair(2)規格
close() システムコールは、 IEEE Std 1003.1-1990 (“POSIX.1”) に適合するはずです。歴史
close() 関数は、 Version 7 AT&T UNIX で登場しました。September 11, 2013 | FreeBSD |