close サブルーチン
目的
ファイル・ディスクリプターをクローズします。
構文
#include <unistd.h>
説明
close サブルーチンは、 FileDescriptor パラメーターに関連したファイルまたは共用メモリー・オブジェクトをクローズします。 ネットワーク・ファイル・システム (NFS) がシステムにインストールされている場合は、このファイルを別のノードに置くことができます。
このプロセスが lockf または fcntl サブルーチンによって以前にロックした FileDescriptor パラメーターによって指定されたファイルに関連するすべてのファイル領域は、アンロックされます。 これは、プロセスがまだ別のファイル記述子によってオープンされているファイルを持っている場合でも発生します。
FileDescriptor パラメーターが、 O_DEFERを指定した open サブルーチンの結果であり、これが最後のファイル・ディスクリプターであった場合、最後の fsync サブルーチン以降にファイルに加えられたすべての変更は破棄されます。
FileDescriptor パラメーターは、マップされたファイルに関連付けられている場合、マップ解除されます。 shmat サブルーチンは、マップされたファイルに関する詳細情報を提供します。
close サブルーチンは、このファイル・ディスクリプターに対する未解決の 非同期入出力要求 を取り消そうとします。 非同期入出力要求を取り消すことができない場合、要求が完了するまでアプリケーションはブロックされます。
FileDescriptor パラメーターが共用メモリー・オブジェクトに関連付けられていて、共用メモリー・オブジェクトが最後のクローズで参照されたままの場合 (つまり、プロセスがメモリー・オブジェクトをマップした場合)、メモリー・オブジェクトの内容全体が、メモリー・オブジェクトが参照されなくなるまで存続します。 これが共用メモリー・オブジェクトの最後のクローズであり、クローズの結果としてメモリー・オブジェクトが参照解除され、メモリー・オブジェクトがリンク解除された場合、そのメモリー・オブジェクトは除去されます。 shm_open サブルーチンは、共用メモリー・オブジェクトに関する詳細情報を提供します。
close サブルーチンは、ファイル・ディスクリプターを使用するすべてのサブルーチンが usr スペースに戻るまでブロックされます。 例えば、スレッドが close を呼び出しており、別のスレッドが同じファイル記述子を使用して select を呼び出している場合、 close サブルーチンは、 select 呼び出しが戻るまで戻りません。
パイプまたは FIFO 特殊ファイルに関連したすべてのファイル記述子がクローズされると、パイプまたは FIFO に残っているデータはすべて廃棄されます。 ファイルと関連したすべてのファイル記述子がクローズされた時にファイルのリンク・カウントが 0 の場合には, ファイルが占めていたスペースが解放され, ファイルはアクセス不能になります。
プロセスが終了すると、すべてのオープン・ファイル記述子がクローズされます。 さらに、ファイル・ディスクリプターに対して close-on-exec フラグが設定されている場合は、 exec サブルーチン中にファイル・ディスクリプターをクローズすることができます。
パラメーター
| 項目 | 説明 |
|---|---|
| FileDescriptor | 有効なオープン・ファイル記述子を指定します。 |
戻り値
正常終了時には値 0 が返されます。 そうでない場合は-1が返され、errnoグローバル変数にエラーが設定される。
基礎となるファイルシステムのインプリメンテーションは、 /usr/include/errno.h ファイルの値のいずれかを close サブルーチンに報告することがあります。 closeサブルーチンは-11を返し、errnoグローバル変数にはファイルシステムからの戻り値が設定されるが、ファイルは閉じられたままである。 FileDescriptorパラメータの状態は、エラーコードセクションで指定された条件を除き、クローズされる。
エラー・コード
close サブルーチンは、次のような場合には失敗します。
| 項目 | 説明 |
|---|---|
| EBADF | FileDescriptor パラメーターが、有効なオープン・ファイル記述子を指定していません。 |
close サブルーチンは、クローズされるファイルが NFSにマウントされていて、サーバーが以下の条件下でダウンしている場合にも、失敗することがあります。
- ファイルはハード・マウントされています。
- ファイルは任意の方法でロックされます。
close サブルーチンは、 NFS がインストールされていて、以下の条件が満たされている場合にも失敗することがあります。
| 項目 | 説明 |
|---|---|
| ETIMEDOUT | 接続がタイムアウトになりました。 |
| 項目 | 説明 |
|---|---|
| EINTR | FileDescriptor の状態が判別できません。 close ルーチンを再試行して、 FileDescriptor がクローズされていることを確認してください。 |