| 標準/拡張機能 | C/C++ | 依存項目 |
|---|---|---|
POSIX.1 |
両方 |
#define _POSIX_SOURCE
#include <unistd.h>
int close(int fildes);
#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() は、プロセスが関連ファイルに関して持っている未解決の レコード・ロックをすべて解除 (取り外し) します。
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 を即時に分解します。
fildes が疑似端末のマスター・サイドを示す 場合、SIGHUP シグナルは、疑似端末のスレーブ・サイドが 制御端末であるプロセス・グループ (ある場合) に 送信されます。
fildes が疑似端末のスレーブ・サイドを示す 場合、ゼロ長のメッセージがマスターに送信されます。
fildes がソケットを参照する場合、close() によりソケット は破棄されます。ソケットが接続指向で、SO_LINGER オプションがソケットに設定して あり、ソケットに未伝送データがある場合、close() は、すべてのデータが 伝送されるまで、現行のリンガー・インターバルまでをブロックします。
close() は、正常終了の場合は 0 を戻します。
例えば、マルチスレッド環境で、(1) あるファイルまたはソケット記述子に対する read() または select() 呼び出しでスレッドがブロックされ、(2) 別のスレッドが同じ記述子に対して close() 呼び出しを同時に発行するという一連のイベントが発生したときに、close() は異常終了し、EAGAIN を戻します。
#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);
}
}