FCNTL(2)

名前
fcntl - ファイル・ディスクリプターを操作する

書式
#include <unistd.h>
#include <fcntl.h>

int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);

説明
fcntl は、ファイル・ディスクリプター fd に関するさまざまな操作を行う。要求する操作の種類は cmd によって決まる:

F_DUPFD
    arg を fd のコピーにする。必要なら最初に fd をクローズ(close)する。

    dup2(2) を使えば、もっと簡単に同じことができる。

    古いディスクリプターと新しいディスクリプターは同じものとして使うことができる。 それらはロック(lock)、ファイル位置ポインター、フラグを共有する。 例えば、片方のディスクリプターのファイル位置が lseek を使って変更された場合、もう片方のファイル位置も変更される。

    しかしながら、二つのディスクリプターは実行時クローズ(close-on-exec)フラグ を共有しない。

    成功すると、新しいディスクリプターが返れる。

F_GETFD
    実行時クローズ(close-on-exec)フラグを読み取る。最下位ビットが 0 なら、 ファイルは exec してもオープン(open)されたままだが、そうでない場合はクローズされる。

F_SETFD
    実行時クローズ(close-on-exec)フラグに arg で指定した値を設定する(最下位のビットのみが使用される)。

F_GETFL
    ディスクリプターのフラグを読み取る。( open(2) の際に設定された全てのフラグが返される。)

F_SETFL
    ディスクリプターのフラグに argで指定した値を設定する。 O_APPEND と O_NONBLOCK のみが設定できる。

    フラグは( dup などで作成された)同じディスクリプターのコピーで共有される。

    フラグとその意味は open(2) で説明されている。

F_GETLK, F_SETLK, F_SETLKW
    任意のファイル・ロックを管理する。三つ目の引数 arg は flock 構造体へのポインタである。(このコールによって上書きされる)。

F_GETLK
    ロックを取得するのを妨げられた場合は、それを妨げた flock構造体を返す。 妨げられなかった場合は、そのロックの l_type フィールドに F_UNLCK を設定する。

F_SETLK
    l_type フィールドが F_RDLCK か F_WRLCK の時、ロックを設定する。 F_UNLCK の時、ロックを解放(clear)する。 もしロックがその他の値の時は、-1 を返し、 errno に EACCES か EAGAIN が設定される。

F_SETLKW
    F_SETLK と同様だが、エラーを返さずにロックが解放されるまで待つ点が異なる。 fcntl() を待っている間にシグナルを受けた場合には、 そこで中断して -1 が返され、 errno に EINTR が設定される。

F_GETOWN
    現在、ファイル・ディスクリプター fd のイベントにより SIGIO シグナルおよび SIGURG シグナルを受けるプロセスのプロセス ID またはプロセス・グループを返す。

    プロセス・グループは負の値で返される。

F_SETOWN
    ファイル・ディスクリプター fd のイベントにより SIGIO シグナルおよび SIGURG シグナルを受けるプロセスのプロセス ID またはプロセス・グループを設定する。

    プロセス・グループは負の値で指定する。 open コールの際の指定または fcntl コールの F_SETFL コマンドを使用してファイル・ディスクリターに O_ASYNC 状態フラグを設定した場合には、 そのファイル・ディスクリプターへの入出力が可能になった 時点で SIGIO シグナルが送られる。シグナルを送るプロセスまたは プロセス・グループは fcntl 関数の F_SETOWN コマンドを使用して選択することができる。 ファイル・ディスクリターがソケット(socket)ならばソケットに 帯域外(out-of-band)データが届いた時に SIGURG シグナルを配送する相手も、 同時に選択することになる。 ファイル・ディスクリプターが端末(terminal)デバイスに 接続していれば、SIGIO シグナルはその端末のフォアグランド・ プロセス・グループへと送られる。 O_ASYNC, F_GETOWN, F_SETOWN の使用は BSD の流儀である。 POSIX では同様に操作を行なうのに、非同期(asynchronous) I/O と aio_sigevent 構造体を持っている。

返り値
成功した場合の返り値は操作定数の種類によって違う:

F_DUPFD
    新しいディスクリプターを返す。

F_GETFD
    フラグの値を返す。

F_GETFL
    フラグの値を返す。

F_GETOWN
    ディスクリプターの所有者を返す。

F_SETFD,
    F_SETFL, F_GETLK, F_SETLK, F_SETLKW -1 以外の何かの値を返す。

エラーの時は -1 が返され、 errno に適切な値が設定される。

エラー

EACCES
    他のプロセスが保持しているロックによって操作が禁止されている。

EAGAIN
    そのファイルは他のプロセスによってメモリ・マップされているため、 操作が禁止されている。

EDEADLK
    指定された F_SETLKW コマンドを実行した場合にはデッドロック(deadlock)に なることが検出された。

EBADF
    fd がオープンされたファイル・ディスクリプターでない。

EINTR
    F_SETLKW コマンドがシグナルにより割り込まれた。

EINVAL
    F_DUPFDで、 arg が負か、もしくは許される最大値よりも大きい。

EMFILE
    F_DUPFDで、 プロセスがすでに最大数までファイル・ディスクリプターをオープンしている。

ENOLCK
    オープンされているロックの数が多過ぎ、ロック・テーブルがいっぱいである。

注意
エラーの際の返り値が dup2 と F_DUPFD では異なっている。

準拠
SVr4, SVID, POSIX, X/OPEN, BSD 4.3. Posix.1 には F_DUPFD, F_GETFD, F_SETFD, F_GETFL, F_SETFL, F_GETLK, F_SETLK, F_SETLKW 操作のみが仕様にある。F_GETOWN, F_SETOWN は BSD的であり、SVr4 ではサポート されていない。F_GETFL/F_SETFL に使用できるフラグは open(2) でサポートされているものと同じであり、それぞれのシステムで異なっている。 O_APPEND, O_NONBLOCK, O_RDONLY, O_RDWR は POSIX.1 の仕様にある。 SVr4 ではここに記述されていない他のいくつかのオプションやフラグを サポートしている。

POSIX.1 には他に EINTR エラーについての記述がある。SVr4 には他に EFAULT, EINTR, EIO, ENOLINK, EOVERFLOW エラー状態についての記述がある。

関連項目
dup2(2), open(2), socket(2), flock(2)