mkfifo, mkfifoat -
FIFOスペシャルファイル(名前付きパイプ)を作成する
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
#include <fcntl.h> /* AT_* 定数の定義 */
#include <sys/stat.h>
int mkfifoat(int dirfd, const char *pathname, mode_t mode);
mkfifoat():
- glibc 2.10 以降:
-
_POSIX_C_SOURCE >= 200809L
- glibc 2.10 より前:
- _ATFILE_SOURCE
mkfifo() は名前
pathname
を持つFIFOスペシャルファイルを作成
する。FIFOの許可モードは
mode
で指定され、プロセスの
umask
によって通常の方式で変更を受ける:
作成されたファイルの許可
モードは
(mode &
~umask) となる。
FIFOスペシャルファイルはパイプに似ているが、作成のされ方のみが異なって
いる。FIFOスペシャルファイルは名前のない通信路ではなく、
mkfifo()
の呼び出しによりファイルシステムの中に加えられる。
ひとたびこのようにしてFIFOスペシャルファイルが作成されると、通常のファ
イルと同じように、どのプロセスからでも読み出し、書き込み用にこれをオー
プンすることができる。ただし、これに対する全ての入出力操作に先立って
その両端がオープンされている必要がある。FIFOを読み出し用にオープンする
と、通常他のプロセスによって同じFIFOが書き込み用にオープンされるまでブ
ロックされ、逆の場合も同様である。
FIFOスペシャルファイルをブロックせずに扱う方法については
fifo(7) を参照のこと。
mkfifoat()
システムコールは
mkfifo()
と全く同様に動作するが、以下で説明する点が異なる。
pathname
で指定されたパス名が相対パスの場合、このパス名はファイルディスクリプター
dirfd
が参照するディレクトリに対する相対パスと解釈される
(
mkfifo()
に相対パス名を渡した場合のように、呼び出したプロセスのカレントワーキングディレクトリに対する相対パスではない)。
pathname
で指定されたパス名が相対パスで、
dirfd が特別な値
AT_FDCWD
の場合、 (
mkfifo()
と同様に)
pathname
は呼び出したプロセスのカレントワーキングディレクトリに対する相対パスと解釈される。
pathname
で指定されたパス名が絶対パスの場合、
dirfd は無視される。
成功した場合
mkfifo() と
mkfifoat() は 0 を返す。
エラーの場合 -1 を返す
(また
errno
が適切に設定される)。
- EACCES
-
pathname
の中のディレクトリの一つに対し検索(実行)許可がない。
- EDQUOT
- ディスクブロックか
inode
がそのファイルシステムのユーザークォータに達していた。
- EEXIST
-
pathname
がすでに存在する。
これには pathname
がシンボリックリンクである場合も含まれる
(シンボリックリンクがリンク切れか
(dangling)
どうかは関係ない)。
- ENAMETOOLONG
-
pathname の長さが
PATH_MAX
を超えているか、個々のファイル
名部分の長さが NAME_MAX
を超えている。GNUシステムにおいては、ファ
イル名の全体の長さに対しては制限は課せられていないが、ファイルシステム
によっては各部分の長さに制限のある可能性がある。
- ENOENT
-
pathname
中のディレクトリ部分が存在しない、
もしくはリンク先の無いシンボリックリンクである。
- ENOSPC
- ディレクトリまたはファイルシステムに新規ファイルを作成する余地がない。
- ENOTDIR
-
pathname
中のディレクトリ要素が、実際にはディレクトリでない。
- EROFS
-
pathname
が読み取り専用のファイルシステムを指している。
mkfifoat()
では以下のエラーも発生する。
- EBADF
-
dirfd
が有効なファイルディスクリプターでない。
- ENOTDIR
-
pathname
が相対パスで、 dirfd
がディレクトリ以外のファイルを参照しているファイルディスクリプターである。
mkfifoat() は glibc 2.4
で追加された。これは、カーネル
2.6.16 以降の Linux
で利用できる
mknodat(2)
を使って実装されている。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
mkfifo(), mkfifoat() |
Thread safety |
MT-Safe |
mkfifo(): POSIX.1-2001, POSIX.1-2008.
mkfifoat(): POSIX.1-2008.
mkfifo(1),
close(2),
open(2),
read(2),
stat(2),
umask(2),
write(2),
fifo(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。