CLOSE(2) — UNIX Programmer’s Manual
名称
close − ディスクリプタを削除する
形式
close(d)
int d;
解説
close コールは、 プロセスのもつ オブジェクトリファレンステーブルから、指定されたディスクリプタを 削除します。 そのディスクリプタが、 対応しているオブジェクトへの最後の参照である場合には、 それはテーブルから取り除かれます。 例えば、 ファイルの最後のクローズでは、 そのファイルに関係する現 seek ポインタの値が失われます。 socket(2) の最後のクローズでは、 名前情報とキューにあるデータが破棄されます。 また、 アドバイザリロックを 保持しているファイルの最後のクローズでは、 そのロックが解除されます (flock(2) 参照)。
1つのプロセスのすべてのディスクリプタは、 exit コールで自動的にクローズされますが、 1プロセス当りのアクティブディスクリプタの数には制限があるため、 多数のディスクリプタを 扱っているプログラムでは、 close コールが必要です。
プロセスがプロセスを 作った (fork(2) 参照)ときには、 その新しいプロセスのすべてのディスクリプタは、 fork が実行される前に親が指していたのと同じオブジェクトを 指します。 新しいプロセスが、 その後 execve(2) を 使用して実行されるのであれば、 通常、 そのプロセスは、 これらのディスクリプタを 受け継ぎます。 ほとんどのディスクリプタは、 execve が試みられる前に、 dup2(2) を用いてアレンジしなおすか、 または close を用いて削除することができます。 しかし、execve が失敗した場合でも、 これらのディスクリプタのうちのいくつかが必要になるのであれば、 execve が成功した場合にはクローズされるようにそれらを アレンジしておく必要があります。 このような場合には、 コール“fcntl(d,F_SETFD,1)”を 使用することができ、 このコールは、execve の成功後に ディスクリプタがクローズされるようにアレンジします。 コール“fcntl(d,F_SETFD,0)”は、 デフォルト値を 復元し、 ディスクリプタを クローズしません。
リターン値
正常終了時には、 値 0 が返されます。 そうでない場合には、 −1 が返され、 グローバル変数 errno がエラーを 示すようにセットされます。
エラー
次の場合、 close は失敗します。
[EBADF] d がアクティブなディスクリプタではない。
関連事項
accept(2), flock(2), open(2), pipe(2), socket(2), socketpair(2), execve(2), fcntl(2)
NEWS-OSRelease 3.3