close() - ファイルのクローズ

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1
XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _POSIX_SOURCE
#include <unistd.h>

int close(int fildes);
X/Open:
#define _XOPEN_SOURCE_EXTENDED 1
#include <unistd.h>

int close(int socket);
バークレー・ソケット:
#define _OE_SOCKETS
#include <unistd.h>

int close(int socket);

機能説明

fildes ファイル記述子をクローズします。この関数は、ファイル記述子を解放して、将来の open() 呼び出し、およびファイル記述子を作成するその他の呼び出しで戻されるようにします。fildes 引数は、階層ファイル・システム (HFS) ファイル を表さなければなりません。

ファイルの最後のオープン・ファイル記述子が クローズされると、ファイルそのものがクローズされます。その時点でファイルのリンク数が 0 の場合、その スペースは解放され、そのファイルはアクセス不能になります。

パイプまたは FIFO ファイルの最後の オープン・ファイル記述子がクローズされると、パイプまたは FIFO ファイルに残っているデータはいずれも 廃棄されます。

close() は、プロセスが関連ファイルに関して持っている未解決の レコード・ロックをすべて解除 (取り外し) します。

ソケットの場合の動作: close() 呼び出しは、socket 記述子に関連したソケットをシャットダウンして、そのソケットに割り振られたリソースを解放します。 socket がオープン TCP 接続を示す場合、その接続がクローズされます。キューに入っている入力データがあるときに、ストリーム・ソケットがクローズされると、TCP 接続 は正しくクローズされるのではなくリセットされます。
パラメーター
説明
socket
クローズされるソケットの記述子。
注: プロセスの終了前に、すべてのソケットを クローズしてください。ソケットに close() 呼び出しを発行する前に、shutdown() 呼び出しを発行する必要があります。
SO_LINGER ソケット・オプションを使用する AF_INET および AF_INET6 ストリーム・ソケット (SOCK_STREAM) では、クローズが発行されたときにデータがまだ残っていると、ソケットは即時に終了しません。以下の構造体を使用して、このオプションの設定と設定解除を 行います。これは、sys/socket.h にあります。
struct linger {
   int l_onoff;      /* zero=off, nonzero=on */
   int l_linger;     /* time is seconds to linger */
};

l_onoff スイッチがゼロ以外の場合、システムは、未送信メッセージを 送達しようとします。リンガー時間が指定されている場合、システム は n 秒だけ待ってから、データをフラッシュして ソケットを終了します。

AF_UNIX の場合には、結合されたソケットのクローズの際に 、unlink() も使用して、bind() 時に作成 されたファイルを削除する必要があります。

XPG4.2 の特殊な動作: STREAM ベースの fildes がクローズされ、呼び出しプロセスが、その STREAM に関連するイベント用の SIGPOLL シグナルを受け取るように事前に登録されていた 場合、呼び出しプロセスは STREAM に関連するイベントに 対して登録解除されます。 STREAM の最後の close() により、fildes に関連した STREAM は分解されます。O_NONBLOCK が設定されていないときに STREAM 用に 通知されたシグナルがなかった場合、およびモジュールの 書き込みキューにデータがある場合、close() は未指定の時間 (モジュールおよび ドライバーごと) だけ任意の出力の処理を待って から STREAM を分解します。時間の遅延は、I_SETCLTIME ioctl() 要求を 通じて変更することができます。O_NONBLOCK フラグが設定してある場合、あるいは 保留シグナルがある場合には、close() は出力の 処理を待たずに STREAM を即時に分解します。

注: z/OS®UNIX サービスは、どのような STREAMS 装置または疑似装置も提 供しません。詳細は、open() — ファイルのオープンを参照してください。

fildes が疑似端末のマスター・サイドを示す 場合、SIGHUP シグナルは、疑似端末のスレーブ・サイドが 制御端末であるプロセス・グループ (ある場合) に 送信されます。

fildes が疑似端末のスレーブ・サイドを示す 場合、ゼロ長のメッセージがマスターに送信されます。

fildes がソケットを参照する場合、close() によりソケット は破棄されます。ソケットが接続指向で、SO_LINGER オプションがソケットに設定して あり、ソケットに未伝送データがある場合、close() は、すべてのデータが 伝送されるまで、現行のリンガー・インターバルまでをブロックします。

戻り値

close() は、正常終了の場合は 0 を戻します。

正常に実行されなかった場合、close() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EAGAIN
指定されたソケット記述子が、同一プロセスの別の スレッドにより現在使用中であるため、この呼び出しは 完了しませんでした。

例えば、マルチスレッド環境で、(1) あるファイルまたはソケット記述子に対する read() または select() 呼び出しでスレッドがブロックされ、(2) 別のスレッドが同じ記述子に対して close() 呼び出しを同時に発行するという一連のイベントが発生したときに、close() は異常終了し、EAGAIN を戻します。

EBADF
fildes が有効なオープン・ファイル記述子 ではありません。あるいは、socket パラメーターが 有効なソケット記述子ではありません。
EBUSY
ファイルがブロックされているため、そのファイルを クローズできません。
EINTR
close() がシグナルによって割り込まれました。ファイルをクローズできる場合とできない場合があります。
EIO
XPG4.2 に関して追加: ファイル・ システムの読み取り中または書き込み中に入出力エラーが発生しました。
ENXIO
fildes が存在しない。ファイルのマイナー番号が誤っています。

#define _POSIX_SOURCE
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

main() {
  int fd;
  char out[20]="Test string";
  if ((fd = creat("./myfile", S_IRUSR | S_IWUSR)) < 0)
    perror("creat error");
  else {
    if (write(fd, out, strlen(out)+1) == -1)
    perror("write() error");

    if (fd = 0) perror("write() error");
    close(fd);
  }
}

関連情報