X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=draft%2Fman2%2Fopen.2;h=e822f470861fd30e4526cdda9913e6c204933db4;hb=898c3329e032dd492adb9ff4949129997cd7849b;hp=26a869e68e4b044202c9acb5ac3dc62abef40dac;hpb=800b83251d42aae4bacc996071d1fdecdd4cfbf9;p=linuxjm%2FLDP_man-pages.git diff --git a/draft/man2/open.2 b/draft/man2/open.2 index 26a869e6..e822f470 100644 --- a/draft/man2/open.2 +++ b/draft/man2/open.2 @@ -1,6 +1,7 @@ .\" This manpage is Copyright (C) 1992 Drew Eckhardt; -.\" and Copyright (C) 1993 Michael Haardt, Ian Jackson. -.\" and Copyright (C) 2008 Greg Banks +.\" and Copyright (C) 1993 Michael Haardt, Ian Jackson. +.\" and Copyright (C) 2008 Greg Banks +.\" and Copyright (C) 2006, 2008, 2013, 2014 Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this @@ -46,7 +47,6 @@ .\" .\" FIXME . Apr 08: The next POSIX revision has O_EXEC, O_SEARCH, and .\" O_TTYINIT. Eventually these may need to be documented. --mtk -.\" FIXME Linux 2.6.33 has O_DSYNC, and a hidden __O_SYNC. .\" .\"******************************************************************* .\" @@ -80,9 +80,9 @@ .\" Updated 2013-05-06, Akihiro MOTOKI .\" Updated 2013-08-16, Akihiro MOTOKI .\" -.TH OPEN 2 2013\-08\-09 Linux "Linux Programmer's Manual" +.TH OPEN 2 2014\-12\-31 Linux "Linux Programmer's Manual" .SH 名前 -open, creat \- ファイルやデバイスのオープン、作成を行う +open, openat, creat \- ファイルのオープン、作成を行う .SH 書式 .nf \fB#include \fP @@ -93,7 +93,28 @@ open, creat \- ファイルやデバイスのオープン、作成を行う \fBint open(const char *\fP\fIpathname\fP\fB, int \fP\fIflags\fP\fB, mode_t \fP\fImode\fP\fB);\fP \fBint creat(const char *\fP\fIpathname\fP\fB, mode_t \fP\fImode\fP\fB);\fP +.sp +\fBint openat(int \fP\fIdirfd\fP\fB, const char *\fP\fIpathname\fP\fB, int \fP\fIflags\fP\fB);\fP +\fBint openat(int \fP\fIdirfd\fP\fB, const char *\fP\fIpathname\fP\fB, int \fP\fIflags\fP\fB, mode_t \fP\fImode\fP\fB);\fP .fi +.sp +.in -4n +glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照): +.in +.sp +\fBopenat\fP(): +.PD 0 +.ad l +.RS 4 +.TP 4 +glibc 2.10 以降: +_XOPEN_SOURCE\ >=\ 700 || _POSIX_C_SOURCE\ >=\ 200809L +.TP +glibc 2.10 より前: +_ATFILE_SOURCE +.RE +.ad +.PD .SH 説明 ファイルの \fIpathname\fP を与えると、 \fBopen\fP() はファイルディスクリプタを返す。 ファイルディスクリプタは、この後に続くシステムコール (\fBread\fP(2), \fBwrite\fP(2), \fBlseek\fP(2), @@ -102,15 +123,15 @@ open, creat \- ファイルやデバイスのオープン、作成を行う .PP デフォルトでは、新しいファイルディスクリプタは \fBexecve\fP(2) を実行した後も オープンされたままとなる (つまり、 \fBfcntl\fP(2) に説明がある \fBFD_CLOEXEC\fP -ファイルディスクリプタフラグは最初は無効である; 後述の \fBO_CLOEXEC\fP フラグ -を使うとこのデフォルトを変更することができる)。 ファイルオフセット +ファイルディスクリプタフラグは最初は無効である); 後述の \fBO_CLOEXEC\fP フラグ +を使うとこのデフォルトを変更することができる。 ファイルオフセット (file offset) はファイルの先頭に設定される (\fBlseek\fP(2) 参照)。 .PP \fBopen\fP() を呼び出すと、「オープンファイル記述」 \fI(open file description)\fP -が作成される。ファイル記述とは、システム全体の オープン中のファイルのテーブルのエントリである。 このエントリは、ファイルオフセットとファイル状態フラグ -(\fBfcntl\fP(2) \fBF_SETFL\fP 操作により変更可能) が保持する。 ファイルディスクリプタはこれらのエントリの一つへの参照である。 -この後で \fIpathname\fP が削除されたり、他のファイルを参照するように変更されたりしても、 この参照は影響を受けない。 -新しいオープンファイル記述は最初は他のどのプロセスとも 共有されていないが、 \fBfork\fP(2) で共有が起こる場合がある。 +が作成される。ファイル記述とは、システム全体のオープン中のファイルのテーブルのエントリである。 +このオープンファイル記述は、ファイルオフセットとファイル状態フラグ (下記参照) が保持する。 +ファイルディスクリプタはオープンファイルっ記述への参照である。 この後で \fIpathname\fP +が削除されたり、他のファイルを参照するように変更されたりしても、 この参照は影響を受けない。 オープンファイル記述の詳細な説明は「注意」の節を参照。 .PP 引き数 \fIflags\fP には、アクセスモード \fBO_RDONLY\fP, \fBO_WRONLY\fP, \fBO_RDWR\fP のどれかひとつが入っていなければならない。 これらはそれぞれ読み込み専用、書き込み専用、読み書き用に ファイルをオープンすることを要求するものである。 @@ -130,9 +151,11 @@ open, creat \- ファイルやデバイスのオープン、作成を行う さらに、 \fIflags\fP には、ファイル作成フラグ (file creation flag) とファイル状態フラグ (file status flag) を 0 個以上「ビット単位の OR (bitwise\-or)」で 指定することができる。 \fIファイル作成フラグ\fP は \fBO_CLOEXEC\fP, \fBO_CREAT\fP, \fBO_DIRECTORY\fP, \fBO_EXCL\fP, \fBO_NOCTTY\fP, -\fBO_NOFOLLOW\fP, \fBO_TRUNC\fP, \fBO_TTY_INIT\fP である。 \fIファイル状態フラグ\fP -は以下のリストのうち上記以外の残りのものである。 二種類のフラグの違いは、ファイル状態フラグの方は \fBfcntl\fP(2) -を使ってその内容を取得したり (場合によっては) 変更したりできる点にある。 ファイル作成フラグとファイル状態フラグの全リストを以下に示す: +\fBO_NOFOLLOW\fP, \fBO_TMPFILE\fP, \fBO_TRUNC\fP, \fBO_TTY_INIT\fP である。 \fIファイル状態フラグ\fP +は以下のリストのうち上記以外の残りのものである。 二種類のフラグの違いは、ファイル状態フラグの方はその内容を取得したり (場合によっては) +変更したりできる点にある。詳細は \fBfcntl\fP(2) を参照。 + +すべてのファイル作成フラグとファイル状態フラグを以下のリストに示す。 .TP \fBO_APPEND\fP .\" For more background, see @@ -148,17 +171,23 @@ flag) を 0 個以上「ビット単位の OR (bitwise\-or)」で 指定する シグナル駆動 I/O (signal\-driven I/O) を有効にする: このファイルディスクリプタへの 入力または出力が可能になった場合に、シグナルを生成する (デフォルトは \fBSIGIO\fP であるが、 \fBfcntl\fP(2) によって変更可能である)。 この機能が使用可能なのは端末、疑似端末、ソケットのみであり、 (Linux 2.6 以降では) パイプと FIFO -に対しても使用できる。 さらに詳しい説明は \fBfcntl\fP(2) を参照すること。 +に対しても使用できる。 さらに詳しい説明は \fBfcntl\fP(2) を参照すること。 下記の「バグ」も参照。 .TP \fBO_CLOEXEC\fP (Linux 2.6.23 以降) +.\" NOTE! several other man pages refer to this text +新しいファイルディスクリプタに対して close\-on\-exec フラグを有効にする。 このフラグを指定することで、 プログラムは +\fBFD_CLOEXEC\fP フラグをセットするために \fBfcntl\fP(2) \fBF_SETFD\fP 操作を別途呼び出す必要がなくなる。 + .\" This flag fixes only one form of the race condition; .\" The race can also occur with, for example, descriptors .\" returned by accept(), pipe(), etc. -新しいファイルディスクリプタに対して close\-on\-exec フラグを有効にする。 このフラグを指定することで、プログラムは -\fBFD_CLOEXEC\fP フラグをセットするための \fBfcntl\fP(2) \fBF_SETFD\fP 操作を別途呼び出す必要がなくなる。 -また、ある種のマルチスレッドのプログラムはこのフラグの使用は 不可欠である。なぜなら、個別に \fBFD_CLOEXEC\fP フラグを設定する -\fBfcntl\fP(2) \fBF_SETFD\fP 操作を呼び出したとしても、あるスレッドがファイルディスクリプタを オープンするのと同時に別のスレッドが -\fBfork\fP(2) と \fBexecve\fP(2) を実行するという競合条件を避けるのには十分ではないからである。 +ある種のマルチスレッドのプログラムはこのフラグの使用は不可欠である点に注意すること。 なぜなら、個別に \fBFD_CLOEXEC\fP フラグを設定する +\fBfcntl\fP(2) \fBF_SETFD\fP 操作を呼び出したとしても、あるスレッドがファイルディスクリプタを オープンするのと同時に別のスレッドが +\fBfork\fP(2) と \fBexecve\fP(2) を実行するという競合条件を避けるのには十分ではないからである。 +実行の順序に依存して、この競合条件の結果、 \fBopen\fP() が返したファイルディスクリプタが \fBfork\fP(2) +で作成された子プロセスにより実行されるプログラムに意図せず見えてしまう可能性がある。 (この種の競合は、 本質的に、 close\-on\-exec +フラグをセットすべきファイルディスクリプタを作成するどのシステムコールでも起こり得るものであり、 他のいろいろな Linux +システムコールでこの問題に対処するために \fBO_CLOEXEC\fP と同等の機能が提供されている。) .TP \fBO_CREAT\fP .\" As at 2.6.25, bsdgroups is supported by ext2, ext3, ext4, and @@ -170,9 +199,11 @@ flag) を 0 個以上「ビット単位の OR (bitwise\-or)」で 指定する .RS .PP \fImode\fP は新しいファイルを作成する場合に使用するアクセス許可 (permission) を指定する。 \fIflags\fP に \fBO_CREAT\fP -が指定されている場合、 \fImode\fP を指定しなければならない。 \fBO_CREAT\fP が指定されていない場合、 \fImode\fP は無視される。 -有効なアクセス許可は、普段と同じようにプロセスの \fIumask\fP によって修正され、作成されたファイルの許可は \fI(mode\ &\ ~umask)\fP となる。 このモードは、新しく作成されたファイルに対するそれ以降のアクセス にのみ適用される点に注意すること。 -読み取り専用のファイルを作成する \fBopen\fP() コールであっても、 読み書き可能なファイルディスクリプタを返すことがありうる。 +か \fBO_TMPFILE\fP が指定されている場合、 \fImode\fP を指定しなければならない。 \fBO_CREAT\fP も \fBO_TMPFILE\fP +も指定されていない場合、 \fImode\fP は無視される。 有効なアクセス許可は、普段と同じようにプロセスの \fIumask\fP +によって修正され、作成されたファイルの許可は \fI(mode\ &\ ~umask)\fP となる。 +このモードは、新しく作成されたファイルに対するそれ以降のアクセス にのみ適用される点に注意すること。 読み取り専用のファイルを作成する +\fBopen\fP() コールであっても、 読み書き可能なファイルディスクリプタを返すことがありうる。 .PP \fImode\fP のために以下のシンボル定数が提供されている : .TP 9 @@ -227,10 +258,17 @@ flag) を 0 個以上「ビット単位の OR (bitwise\-or)」で 指定する .\" http://marc.theaimsgroup.com/?t=112748702800001&r=1&w=2 .\" [PATCH] open: O_DIRECTORY and O_CREAT together should fail .\" O_DIRECTORY | O_CREAT causes O_DIRECTORY to be ignored. -\fIpathname\fP がディレクトリでなければオープンは失敗する。 このフラグは Linux 特有であり、 \fBopendir\fP(3) が FIFO +\fIpathname\fP がディレクトリでなければオープンは失敗する。 このフラグは、 \fBopendir\fP(3) が FIFO やテープデバイスに対してコールされた場合の サービス不能 (denial\-of\-service) 攻撃を避けるために カーネル 2.1.126 で追加された。 .TP +\fBO_DSYNC\fP +ファイルに対する書き込み操作は、同期 I/O の\fIデータ\fP完全性完了の要件に基づいて行われる。 + +\fBwrite\fP(2) (や同様のコール) が返るまでに、 +書き込まれたデータおよびデータを取得するのに必要なファイルメタデータが裏で利用されているハードウェアに転送される (つまり、\fBwrite\fP(2) +の後に \fBfdatasync\fP(2) を呼び出したのと同じようになる)。 \fI下記の「注意」も参照のこと\fP。 +.TP \fBO_EXCL\fP この呼び出しでファイルが作成されることを保証する。このフラグが \fBO_CREAT\fP と 一緒に指定され、 \fIpathname\fP のファイルが既に存在した場合、 \fBopen\fP() は失敗 @@ -302,64 +340,121 @@ PID を組み合わせた名前) を作成し、 \fBlink\fP(2) を使用して .\" Subject: Re: [PATCH] open(2): document O_PATH .\" Newsgroups: gmane.linux.man, gmane.linux.kernel .\" -Obtain a file descriptor that can be used for two purposes: to indicate a -location in the filesystem tree and to perform operations that act purely at -the file descriptor level. The file itself is not opened, and other file -operations (e.g., \fBread\fP(2), \fBwrite\fP(2), \fBfchmod\fP(2), \fBfchown\fP(2), -\fBfgetxattr\fP(2), \fBmmap\fP(2)) fail with the error \fBEBADF\fP. - -The following operations \fIcan\fP be performed on the resulting file -descriptor: +このフラグを指定して取得したファイルディスクリプタは、 ファイルシステムツリー内での場所を示すため、 +純粋にファイルディスクリプタレベルでの作用する操作を実行するため、 の二つの目的で使用することができる。 ファイル自身はオープンされず、 +他のファイル操作 (例えば \fBread\fP(2), \fBwrite\fP(2), \fBfchmod\fP(2), \fBfchown\fP(2), +\fBfgetxattr\fP(2), \fBmmap\fP(2)) はエラー \fBEBADF\fP で失敗する。 + +取得したファイルディスクリプタに対して以下の操作を行うことが「できる」。 .RS .IP * 3 .\" commit 332a2e1244bd08b9e3ecd378028513396a004a24 .\" fstat(): commit 55815f70147dcfa3ead5738fd56d3574e2e3c1c2 -\fBclose\fP(2); \fBfchdir\fP(2) (since Linux 3.5); \fBfstat\fP(2) (since Linux -3.6). +\fBclose\fP(2); \fBfchdir\fP(2) (Linux 3.5 以降); \fBfstat\fP(2) (Linux 3.6 以降) .IP * -Duplicating the file descriptor (\fBdup\fP(2), \fBfcntl\fP(2) \fBF_DUPFD\fP, etc.). +ファイルディスクリプタの複製 (\fBdup\fP(2), \fBfcntl\fP(2) \fBF_DUPFD\fP など) .IP * -Getting and setting file descriptor flags (\fBfcntl\fP(2) \fBF_GETFD\fP and -\fBF_SETFD\fP). +ファイルディスクリプタフラグの取得と設定 (\fBfcntl\fP(2) の \fBF_GETFD\fP と \fBF_SETFD\fP) .IP * -Retrieving open file status flags using the \fBfcntl\fP(2) \fBF_GETFL\fP -operation: the returned flags will include the bit \fBO_PATH\fP. - +\fBfcntl\fP(2) の \fBF_GETFL\fP 操作を使ったオープンされたファイルの状態フラグの取得。 返されるフラグには \fBO_PATH\fP +ビットが含まれる。 .IP * -Passing the file descriptor as the \fIdirfd\fP argument of \fBopenat\fP(2) and -the other "*at()" system calls. +\fBopenat\fP(2) や他の "*at()" 系のシステムコールの \fIdirfd\fP 引数としてそのファイルディスクリプタを渡す。 これには、 +ファイルがディレクトリでない場合に \fBlinkat\fP(2) に \fBAT_EMPTY_PATH\fP が指定された場合 (や procfs 経由で +\fBAT_SYMLINK_FOLLOW\fP が使用された場合) を含む。 .IP * -Passing the file descriptor to another process via a UNIX domain socket (see -\fBSCM_RIGHTS\fP in \fBunix\fP(7)). +そのファイルディスクリプタを別のプロセスに UNIX ドメインソケット経由で渡す。 (\fBunix\fP(7) の \fBSCM_RIGHTS\fP を参照) .RE .IP -When \fBO_PATH\fP is specified in \fIflags\fP, flag bits other than \fBO_DIRECTORY\fP -and \fBO_NOFOLLOW\fP are ignored. +\fIflags\fP に \fBO_PATH\fP が指定された場合、 \fBO_CLOEXEC\fP, \fBO_DIRECTORY\fP, \fBO_NOFOLLOW\fP +以外のフラグビットは無視される。 -If the \fBO_NOFOLLOW\fP flag is also specified, then the call returns a file -descriptor referring to the symbolic link. This file descriptor can be used -as the \fIdirfd\fP argument in calls to \fBfchownat\fP(2), \fBfstatat\fP(2), -\fBlinkat\fP(2), and \fBreadlinkat\fP(2) with an empty pathname to have the calls -operate on the symbolic link. +\fIpathname\fP がシンボリックリンクで \fBO_NOFOLLOW\fP フラグも合わせて指定された場合、 +この呼び出しではシンボリックリンクを参照するファイルディスクリプタを返す。 このファイルディスクリプタは、 空のパス名を指定した +\fBfchownat\fP(2), \fBfstatat\fP(2), \fBlinkat\fP(2), \fBreadlinkat\fP(2) の呼び出しで +\fIdirfd\fP 引数として使うことで、 そのシンボリックリンクに対して操作を行うことができる。 .TP \fBO_SYNC\fP -ファイルは同期 (synchronous) I/O モードでオープンされる。 \fBopen\fP() が返したファイルディスクリプタに対して -\fBwrite\fP(2) を行うと、必ず呼び出したプロセスをブロックし、 該当ハードウェアに物理的に書き込まれるまで返らない。 -\fI以下の「注意」の章も参照。\fP +ファイルに対する書き込み操作は、同期 I/O の\fIファイル\fP完全性完了の要件に基づいて行われる (これに対し \fBO_DSYNC\fP では同期 I/O +の\fIデータ\fP完全性完了が提供される)。 + +\fBwrite\fP(2) (や同様のコール) が返るまでに、 書き込まれたデータと関連するファイルメタデータが裏で利用されているハードウェアに転送される +(つまり、\fBwrite\fP(2) の後に \fBfsync\fP(2) を呼び出したのと同じようになる)。 \fI下記の「注意」も参照のこと\fP。 +.TP +\fBO_TMPFILE\fP (Linux 3.11 以降) +.\" commit 60545d0d4610b02e55f65d141c95b18ccf855b6e +.\" commit f4e0c30c191f87851c4a53454abb55ee276f4a7e +.\" commit bb458c644a59dbba3a1fe59b27106c5e68e1c4bd +名前なしの一時ファイルを作成する。 \fIpathname\fP 引き数はディレクトリを指定する。 名前なしの inode +がそのディレクトリが存在するファイルシステムに作成される。 そのファイルに名前を付与しない限り、 作成されたファイルに書き込まれた内容は、 +最後のファイルディスクリプタがクローズされる際に失われる。 + +\fBO_TMPFILE\fP は必ず \fBO_RDWR\fP か \fBO_WRONLY\fP のいずれかと一緒に使わなければならない。 \fBO_EXCL\fP +も指定することができる。 \fBO_EXCL\fP が指定されなかった場合、 \fBlinkat\fP(2) +を使って、そのファイルシステムにこの一時ファイルへのリンクを作成し、ファイルを永続化することができる。 以下のコードのようにすればよい。 + +.in +4n +.nf +char path[PATH_MAX]; +fd = open("/path/to/dir", O_TMPFILE | O_RDWR, + S_IRUSR | S_IWUSR); + +/* 'fd' に対するファイル I/O ... */ + +snprintf(path, PATH_MAX, "/proc/self/fd/%d", fd); +linkat(AT_FDCWD, path, AT_FDCWD, "/path/for/file", + AT_SYMLINK_FOLLOW); +.fi +.in + +この場合、 \fBopen\fP() の \fImode\fP 引き数は \fBO_CREAT\fP と同様にファイルのアクセス許可モードの決定に使われる。 + +\fBO_TMPFILE\fP とともに \fBO_EXCL\fP を指定すると、 +一時ファイルに対して上記の方法でファイルシステムへのリンクを行うことができなくなる (この場合の \fBO_EXCL\fP の意味は他の場合の +\fBO_EXCL\fP の意味とは異なる点に注意)。 + + +.\" Inspired by http://lwn.net/Articles/559147/ +\fBO_TMPFILE\fP には主に二つの用途がある。 +.RS +.IP * 3 +改善された \fBtmpfile\fP(3) の機能: (1) クローズ時に自動的に削除される、 (2) パス名では決して参照できない、 (3) +シンボリックリンク攻撃ができない、 (4) 呼び出し元が一意な名前を考える必要がない、 という特長を持つ競合のない一時ファイルの作成。 +.IP * +最初は見えないファイルを作成し、 それからデータを書き込んだり、適切なファイルシステム属性を持つように調整したり (\fBchown\fP(2), +\fBchmod\fP(2), \fBfsetxattr\fP(2) など) した後、 準備が全て整った状態で (上述の \fBlinkat\fP(2) を使って) +ファイルシステム内にアトミックにリンクを行う。 +.RE +.IP +.\" commit 99b6436bc29e4f10e4388c27a3e4810191cc4788 +.\" commit ab29743117f9f4c22ac44c13c1647fb24fb2bafe +\fBO_TMPFILE\fP は、 裏で利用されるファイルシステムによるサポートが必要である。 一部の Linux +ファイルシステムだけがこの機能をサポートしている。 最初の実装では、 ext2, ext3, ext4, UDF, Minix, shmem +ファイルシステムがサポートしていた。 XFS でのサポートが Linux 3.15 で追加された。 .TP \fBO_TRUNC\fP -ファイルが既に存在し、通常ファイルであり、 書き込み可モードでオープンされている (つまり、 \fBO_RDWR\fPまたは\fBO_WRONLY\fP の) -場合、長さ 0 に切り詰め (truncate) られる。 ファイルが FIFO または端末デバイスファイルの場合、 \fBO_TRUNC\fP +ファイルが既に存在し、通常ファイルであり、 アクセスモードで書き込みが許可されている (つまり、 \fBO_RDWR\fP または \fBO_WRONLY\fP +の) 場合、長さ 0 に切り詰め (truncate) られる。 ファイルが FIFO または端末デバイスファイルの場合、 \fBO_TRUNC\fP フラグは無視される。 それ以外の場合、 \fBO_TRUNC\fP の効果は未定義である。 -.PP -これらの選択フラグのいくつかはファイルをオープンした後でも \fBfcntl\fP(2) を使用して変更することができる。 - +.SS creat() \fBcreat\fP() は \fIflags\fP に \fBO_CREAT|O_WRONLY|O_TRUNC\fP を指定して \fBopen\fP() を行うのと等価である。 +.SS openat() +\fBopenat\fP() システムコールは \fBopen\fP() と全く同様に動作するが、以下で説明する点が異なる。 + +\fIpathname\fP で指定されたパス名が相対パスの場合、このパス名はファイルディスクリプター \fIdirfd\fP +が参照するディレクトリに対する相対パスと解釈される (\fBopen\fP() +に相対パス名を渡した場合のように、呼び出したプロセスのカレントワーキングディレクトリに対する相対パスではない)。 + +\fIpathname\fP で指定されたパス名が相対パスで、 \fIdirfd\fP が特別な値 \fBAT_FDCWD\fP の場合、 (\fBopen\fP() +と同様に) \fIpathname\fP は呼び出したプロセスのカレントワーキングディレクトリに対する相対パスと解釈される。 + +\fIpathname\fP で指定されたパス名が絶対パスの場合、 \fIdirfd\fP は無視される。 .SH 返り値 -\fBopen\fP() と \fBcreat\fP() は新しいファイルディスクリプタを返す。 エラーが発生した場合は \-1 を返す (その場合は -\fIerrno\fP が適切に設定される)。 +\fBopen\fP(), \fBopenat\fP(), \fBcreat\fP() は新しいファイルディスクリプタを返す。 エラーが発生した場合は \-1 を返す +(その場合は \fIerrno\fP が適切に設定される)。 .SH エラー +\fBopen\fP(), \fBopenat\fP(), \fBcreat\fP() は以下のエラーで失敗する。 .TP \fBEACCES\fP ファイルに対する要求されたアクセスが許されていないか、 \fIpathname\fP のディレクトリ部分の何れかのディレクトリに検索許可がなかった。 @@ -382,19 +477,32 @@ operate on the symbolic link. システムコールがシグナルハンドラにより割り込まれた。 \fBsignal\fP(7) 参照。 .TP \fBEINVAL\fP -The filesystem does not support the \fBO_DIRECT\fP flag. See \fBNOTES\fP for more -information. +ファイルシステムが \fBO_DIRECT\fP フラグをサポートしていない。 詳細は\fB注意\fPを参照。 +.TP +\fBEINVAL\fP +.\" In particular, __O_TMPFILE instead of O_TMPFILE +\fIflags\fP に無効な値が入っている。 +.TP +\fBEINVAL\fP +\fIflags\fP に \fBO_TMPFILE\fP が指定されたが、 \fBO_WRONLY\fP も \fBO_RDWR\fP も指定されていなかった。 .TP \fBEISDIR\fP \fIpathname\fP はディレクトリを参照しており、書き込み要求が含まれていた (つまり \fBO_WRONLY\fP または \fBO_RDWR\fP が設定されている)。 .TP +\fBEISDIR\fP +\fIpathname\fP が存在するディレクトリを参照していて、 \fBO_TMPFILE\fP および \fBO_WRONLY\fP と \fBO_RDWR\fP +の一方が \fIflags\fP に指定されていたが、 このカーネルバージョンでは \fBO_TMPFILE\fP 機能が提供されていない。 +.TP \fBELOOP\fP -\fIpathname\fP を解決する際に遭遇したシンボリックリンクが多過ぎる。 または \fBO_NOFOLLOW\fP が指定されており、 -\fIpathname\fP がシンボリックリンクだった。 +\fIpathname\fP を解決する際に遭遇したシンボリックリンクが多過ぎる。 +.TP +\fBELOOP\fP +\fIpathname\fP がシンボリックリンクで、 \fIflags\fP に \fBO_NOFOLLOW\fP が指定されたが、 \fBO_PATH\fP +が指定されていなかった。 .TP \fBEMFILE\fP -プロセスがオープンしているファイル数がすでに最大数に達している。 +プロセスがオープンしているファイル数がすでに最大数に達している (\fBgetrlimit\fP(2) の \fBRLIMIT_NOFILE\fP の説明を参照)。 .TP \fBENAMETOOLONG\fP \fIpathname\fP が長過ぎる。 @@ -410,6 +518,10 @@ information. \fBO_CREAT\fP が設定されておらず、かつ指定されたファイルが存在しない。 または、 \fIpathname\fP のディレクトリ部分が存在しないか壊れた (dangling) シンボリックリンクである。 .TP +\fBENOENT\fP +\fIpathname\fP が存在しないディレクトリを参照していて、 \fBO_TMPFILE\fP および \fBO_WRONLY\fP と \fBO_RDWR\fP +の一方が \fIflags\fP に指定されていたが、 このカーネルバージョンでは \fBO_TMPFILE\fP 機能が提供されていない。 +.TP \fBENOMEM\fP 十分なカーネルメモリーがない。 .TP @@ -421,8 +533,11 @@ information. \fIpathname\fP がディレクトリでない。 .TP \fBENXIO\fP -\fBO_NONBLOCK\fP | \fBO_WRONLY\fP が設定されており、指定したファイルが FIFO で -そのファイルを読み込みのためにオープンしているプロセスが存在しない。 または、ファイルがデバイススペシャルファイルで 対応するデバイスが存在しない。 +\fBO_NONBLOCK\fP | \fBO_WRONLY\fP が設定されており、指定したファイルが FIFO で そのファイルを読み込み用でオープンしている +FIFO が存在しない。 または、ファイルがデバイススペシャルファイルで 対応するデバイスが存在しない。 +.TP +\fBEOPNOTSUPP\fP +\fIpathname\fP を含んでいるファイルシステムが \fBO_TMPFILE\fP をサポートしていない。 .TP \fBEOVERFLOW\fP .\" See http://bugzilla.kernel.org/show_bug.cgi?id=7253 @@ -430,7 +545,7 @@ information. .\" Reported 2006-10-03 \fIpathname\fP が参照しているのが、大き過ぎてオープンできない通常のファイルである。 通常、このエラーが発生するは、32 ビットプラットフォーム上で \fI\-D_FILE_OFFSET_BITS=64\fP を指定せずにコンパイルされたアプリケーションが、ファイルサイズが -\fI(2<31)\-1\fP ビットを超えるファイルを開こうとした場合である。 上記の \fBO_LARGEFILE\fP も参照。 これは +\fI(1<31)\-1\fP バイトを超えるファイルを開こうとした場合である。 上記の \fBO_LARGEFILE\fP も参照。 これは POSIX.1\-2001 で規定されているエラーである。 2.6.24 より前のカーネルでは、Linux はこの場合にエラー \fBEFBIG\fP を返していた。 .TP @@ -439,6 +554,9 @@ POSIX.1\-2001 で規定されているエラーである。 2.6.24 より前の \fBO_NOATIME\fP フラグが指定されたが、呼び出し元の実効ユーザー ID が ファイルの所有者と一致せず、かつ呼び出し元に特権 (\fBCAP_FOWNER\fP) がない。 .TP +\fBEPERM\fP +操作が file seal により禁止されている。 \fBfcntl\fP(2) 参照。 +.TP \fBEROFS\fP \fIpathname\fP が読み込み専用のファイルシステム上のファイルを参照しており、 書き込みアクセスが要求された。 .TP @@ -447,33 +565,37 @@ POSIX.1\-2001 で規定されているエラーである。 2.6.24 より前の .TP \fBEWOULDBLOCK\fP \fBO_NONBLOCK\fP フラグが指定されたが、そのファイルには矛盾するリースが設定されていた (\fBfcntl\fP(2) 参照)。 +.PP +\fBopenat\fP() では以下のエラーも発生する。 +.TP +\fBEBADF\fP +\fIdirfd\fP が有効なファイルディスクリプタではない。 +.TP +\fBENOTDIR\fP +\fIpathname\fP が相対パス名で、 \fIdirfd\fP がディレクトリ以外のファイルを参照しているファイルディスクリプタである。 +.SH バージョン +\fBopenat\fP() はカーネル 2.6.16 で Linux に追加された。 ライブラリによるサポートはバージョン 2.4 で glibc +に追加された。 .SH 準拠 -SVr4, 4.3BSD, POSIX.1\-2001. フラグ \fBO_DIRECTORY\fP, \fBO_NOATIME\fP, -\fBO_NOFOLLOW\fP, \fBO_PATH\fP は Linux 特有のものであり、 これらのフラグの定義を得るためには、 -(「どの」ヘッダファイルをインクルードするよりも前に) \fB_GNU_SOURCE\fP を定義する必要があるかもしれない。 +\fBopen\fP(), \fBcreat\fP() SVr4, 4.3BSD, POSIX.1\-2001, POSIX.1\-2008. -\fBO_CLOEXEC\fP フラグは POSIX.1\-2001 では規定されていないが、 POSIX.1\-2008 で規定されている。 +\fBopenat\fP(): POSIX.1\-2008. -\fBO_DIRECT\fP は POSIX では規定されていない。 \fBO_DIRECT\fP の定義を得るには -(「どの」ヘッダファイルをインクルードするよりも前に) \fB_GNU_SOURCE\fP を定義しなければならない。 +フラグ \fBO_DIRECT\fP, \fBO_NOATIME\fP, \fBO_PATH\fP, \fBO_TMPFILE\fP は Linux 特有のものである。 +これらのフラグの定義を得るためには \fB_GNU_SOURCE\fP を定義しなければならない。 + +フラグ \fBO_CLOEXEC\fP, \fBO_DIRECTORY\fP, \fBO_NOFOLLOW\fP は POSIX.1\-2001 では規定されていないが、 +POSIX.1\-2008 では規定されている。 glibc 2.12 以降では、これらの定義を得るには、 \fB_POSIX_C_SOURCE\fP を +200809L 以上の値で定義するか、 \fB_XOPEN_SOURCE\fP を 700 以上の値で定義する。 glibc 2.11 以前では、 +これらの定義を得るには \fB_GNU_SOURCE\fP を定義する。 + +\fBfeature_test_macros\fP(7) に注意書きがあるように、 \fB_POSIX_C_SOURCE\fP, \fB_XOPEN_SOURCE\fP, +\fB_GNU_SOURCE\fP などの機能検査マクロは\fIどの\fPヘッダーファイルをインクルードするより前に定義しなければならない。 .SH 注意 Linux では、 \fBO_NONBLOCK\fP フラグは、 open を実行したいが read または write を実行する意図は 必ずしもないことを意味する。 これは \fBioctl\fP(2) のためのファイルディスクリプタを取得するために、 デバイスをオープンするときによく用いられる。 -.\" See for example util-linux's disk-utils/setfdprm.c -.\" For some background on access mode 3, see -.\" http://thread.gmane.org/gmane.linux.kernel/653123 -.\" "[RFC] correct flags to f_mode conversion in __dentry_open" -.\" LKML, 12 Mar 2008 -「アクセスモード」の値 \fBO_RDONLY\fP, \fBO_WRONLY\fP, \fBO_RDWR\fP は、 \fIflags\fP -に指定できる他の値と違い、個々のビットを指定するものではなく、 これらの値は \fIflags\fP の下位 2 ビットを定義する。 \fBO_RDONLY\fP, -\fBO_WRONLY\fP, \fBO_RDWR\fP はそれぞれ 0, 1, 2 に定義されている。 言い換えると、 \fBO_RDONLY | -O_WRONLY\fP の組み合わせは論理的に間違いであり、確かに \fBO_RDWR\fP と同じ意味ではない。 Linux -では、特別な、非標準なアクセスモードとして 3 (バイナリでは 11) が 予約されており \fIflags\fP に指定できる。 -このアクセスモードを指定すると、ファイルの読み出し/書き込み許可をチェックし、 読み出しにも書き込みにも使用できないディスクリプタを返す。 -この非標準のアクセスモードはいくつかの Linux ドライバで、デバイス固有の \fBioctl\fP(2) -操作にのみ使用されるディスクリプタを返すために使われている。 .LP .\" Linux 2.0, 2.5: truncate .\" Solaris 5.7, 5.8: truncate @@ -482,28 +604,110 @@ O_WRONLY\fP の組み合わせは論理的に間違いであり、確かに \fBO .\" HP-UX 11.22: truncate .\" FreeBSD 4.7: truncate \fBO_RDONLY | O_TRUNC\fP の影響は未定義であり、その動作は実装によって異なる。 多くのシステムではファイルは実際に切り詰められる。 -.PP -NFS を実現しているプロトコルには多くの不備があり、特に \fBO_SYNC\fP と \fBO_NDELAY\fP に影響する。 - -POSIX では、3 種類の同期 I/O が提供されており、 \fBO_SYNC\fP, \fBO_DSYNC\fP, \fBO_RSYNC\fP -フラグがこれに対応するものである。 今のところ (カーネル 2.6.31)、 Linux では \fBO_SYNC\fP だけが実装されているが、 glibc -は \fBO_DSYNC\fP と \fBO_RSYNC\fP に \fBO_SYNC\fP と同じ数値を割り当てている。 ほとんどの Linux -のファイルシステムは、実際には POSIX の \fBO_SYNC\fP の動作ではなく \fBO_DSYNC\fP の動作だけを実装している。 POSIX の -\fBO_SYNC\fP では、 \fBopen\fP() がユーザ空間に返る際に、書き込みに関する全てのメタデータの -更新がディスクに書き込まれている必要がある。 一方、 \fBO_DSYNC\fP では、 \fBopen\fP() -が返るまでに、実際のファイルのデータとそのデータを取得するために 必要なメタデータだけがディスクに書き込まれていればよい。 \fBopen\fP() はスペシャルファイルをオープンすることができるが、 \fBcreat\fP() でスペシャルファイルを作成できない点に注意すること。 代わりに \fBmknod\fP(2) を使用する。 -.LP -UID マッピングを使用している NFS ファイルシステムでは、 \fBopen\fP() がファイルディスクリプタを返した場合でも \fBread\fP(2) -が \fBEACCES\fP で拒否される場合がある。 これはクライアントがアクセス許可のチェックを行って \fBopen\fP() -を実行するが、読み込みや書き込みの際には サーバーで UID マッピングが行われるためである。 +.\" +.\" ファイルが新しく作成されると、 ファイルの \fIst_atime\fP, \fIst_ctime\fP, \fIst_mtime\fP フィールド (それぞれ最終アクセス時刻、最終状態変更時刻、最終修正時刻である。 \fBstat\fP(2) 参照) が現在時刻に設定される。 さらに親ディレクトリの \fIst_ctime\fP と \fIst_mtime\fP も現在時刻に設定される。 それ以外の場合で、O_TRUNC フラグでファイルが修正されたときは、 ファイルの \fIst_ctime\fP と \fIst_mtime\fP フィールドが現在時刻に設定される。 +.SS オープンファイル記述 +オープンファイル記述という用語は POSIX +で使用されている用語で、オープンされているファイルのシステム共通のテーブルのエントリーを参照するものである。 +別の文脈では、このオブジェクトはいろいろな呼び方があり、 +「オープンファイルオブジェクト」、「ファイルハンドル」、「オープンファイルテーブルエントリー」、 カーネル開発者の用語では \fIstruct file\fP +などと呼ばれる。 + +ファイルディスクリプタが (\fBdup\fP(2) や同様のシステムコールを使って) 複製される際に、 +複製されたファイルディスクリプタは元のファイルディスクリプタと同じオープンファイル記述を参照する。 結果として 2 +つのファイルディスクリプタはファイルオフセットとファイル状態フラグを共有する。 このような共有はプロセス間でも起こり得る。 \fBfork\fP(2) +で作成された子プロセスは親プロセスのファイルディスクリプタの複製を継承し、これらの複製は同じオープンファイル記述を参照する。 + +.\" +.\" +1 つのファイルに対して \fBopen\fP(2) を行う毎に、新しいオープンファイル記述が作成される。 したがって、 1 つのファイル inode +に対して複数のオープンファイル記述が存在することがありえる。 +.SS "同期 I/O" +POSIX.1\-2008 の「同期 I/O」の選択肢として複数種類が規定されており、 動作を制御するために \fBopen\fP() フラグとして +\fBO_SYNC\fP, \fBO_DSYNC\fP, \fBO_RSYNC\fP が規定されている。 この選択肢を実装がサポートしているかに関わらず、 +各実装では少なくとも通常のファイルに対して \fBO_SYNC\fP が利用できなければならない。 + +Linux は \fBO_SYNC\fP と \fBO_DSYNC\fP を実装しているが、 \fBO_RSYNC\fP は実装していない (少し間違っているのだが、 +glibc では \fBO_RSYNC\fP が \fBO_SYNC\fP と同じ値で定義されている)。 + +\fBO_SYNC\fP は、 同期 I/O での\fIファイル\fP完全性完了を提供する。 つまり、 +書き込み操作はデータとすべての関連メタデータを裏で利用されているハードウェアにフラッシュすることを意味する。 \fBO_DSYNC\fP は、 同期 I/O +での\fIデータ\fP完全性完了を提供する。 つまり、 書き込み操作はデータを裏で利用されているハードウェアにフラッシュするが、 +それ以降の読み出し操作が正常に完了するのに必要なメタデータの更新のみをフラッシュする。 データ完全性完了は、 +ファイル完全性完了を必要としないアプリケーションで、 ディスク操作の数を減らすことができる。 + +2 種類の完了の違いを理解するために、 ファイルメタデータの 2 つの要素、 ファイルの最終修正時刻 (\fIst_mtime\fP) +とファイル長、を考える。 すべての書き込み操作は最終修正時刻を更新するが、 ファイルの末尾にデータを追加する書き込み操作のみがファイル長を変更する。 +最終修正時刻は、 読み出しが正常に完了するのに必要ではないが、 ファイル長は必要である。 したがって、 \fBO_DSYNC\fP +はファイル長のメタデータの更新がフラッシュされることだけを保証する (これに対して \fBO_SYNC\fP +では最終修正時刻のメタデータも常にフラッシュされる)。 + +Linux 2.6.33 より前では、 Linux は \fBopen\fP() では \fBO_SYNC\fP フラグのみを実装していた。 しかしながら、 +このフラグが指定された場合、 ほとんどのファイルシステムで提供されていたのは実際には同期 I/O での\fIデータ\fP完全性完了と等価なものであった +(つまり、 \fBO_SYNC\fP は実際には \fBO_DSYNC\fP と等価なものとして実装されていた)。 + +.\" +.\" +Linux 2.6.33 行こう では、 正しい \fBO_SYNC\fP のサポートが提供されている。 しかしながら、 +バイナリレベルの後方互換性を保証するため、 \fBO_DSYNC\fP は以前の \fBO_SYNC\fP と同じ値で定義されており、 \fBO_SYNC\fP は +\fBO_DSYNC\fP フラグの値を含む新しい (2 ビットの) フラグ値として定義されている。 これにより、 +新しいヘッダを使ってコンパイルされたアプリケーションで、 2.6.33 より前のカーネルで少なくとも \fBO_DSYNC\fP +の動作は同じになることが保証される。 +.SS NFS +NFS を実現しているプロトコルには多くの不備があり、特に \fBO_SYNC\fP と \fBO_NDELAY\fP に影響する。 + +.\" +.\" +UID マッピングを使用している NFS ファイルシステムでは、 \fBopen\fP() がファイルディスクリプタを返した場合でも \fBread\fP(2) +が \fBEACCES\fP で拒否される場合がある。 これはクライアントがアクセス許可のチェックを行って \fBopen\fP() +を実行するが、読み込みや書き込みの際には サーバーで UID マッピングが行われるためである。 +.SS ファイルアクセスモード +「アクセスモード」の値 \fBO_RDONLY\fP, \fBO_WRONLY\fP, \fBO_RDWR\fP は、 \fIflags\fP +に指定できる他の値と違い、個々のビットを指定するものではなく、 これらの値は \fIflags\fP の下位 2 ビットを定義する。 \fBO_RDONLY\fP, +\fBO_WRONLY\fP, \fBO_RDWR\fP はそれぞれ 0, 1, 2 に定義されている。 言い換えると、 \fBO_RDONLY | +O_WRONLY\fP の組み合わせは論理的に間違いであり、確かに \fBO_RDWR\fP と同じ意味ではない。 + +.\" See for example util-linux's disk-utils/setfdprm.c +.\" For some background on access mode 3, see +.\" http://thread.gmane.org/gmane.linux.kernel/653123 +.\" "[RFC] correct flags to f_mode conversion in __dentry_open" +.\" LKML, 12 Mar 2008 +.\" +.\" +Linux では、特別な、非標準なアクセスモードとして 3 (バイナリでは 11) が 予約されており \fIflags\fP に指定できる。 +このアクセスモードを指定すると、ファイルの読み出し/書き込み許可をチェックし、 読み出しにも書き込みにも使用できないディスクリプタを返す。 +この非標準のアクセスモードはいくつかの Linux ドライバで、デバイス固有の \fBioctl\fP(2) +操作にのみ使用されるディスクリプタを返すために使われている。 +.SS "openat() や他のディレクトリファイルディスクリプタ API の基本原理" +\fBopenat\fP() やディレクトリファイルディスクリプタを引き数を取る他のシステムコールやライブラリ関数 (\fBexecveat\fP(2), +\fBfaccessat\fP(2), \fBfanotify_mark\fP(2), \fBfchmodat\fP(2), \fBfchownat\fP(2), +\fBfstatat\fP(2), \fBfutimesat\fP(2), \fBlinkat\fP(2), \fBmkdirat\fP(2), \fBmknodat\fP(2), +\fBname_to_handle_at\fP(2), \fBreadlinkat\fP(2), \fBrenameat\fP(2), \fBsymlinkat\fP(2), +\fBunlinkat\fP(2), \fButimensat\fP(2) \fBmkfifoat\fP(3), \fBscandirat\fP(3)) +は二つの理由から用意されている。 ここでは、 \fBopenat\fP コールに関して説明するが、この基本原理は他のインターフェースでも同じである。 + +最初の理由として、 \fBopenat\fP() を使うと、 アプリケーションは、 カレントワーキングディレクトリ以外のディレクトリで \fBopen\fP() +を使ってファイルをオープンする際に起こり得る競合条件を避けることができる。 これらの競合条件は、 \fBopen\fP() +に渡されたディレクトリプレフィックスの構成要素が \fBopen\fP() の呼び出しと並行して変化する可能性があるという点に由来している。 例えば、ファイル +\fIpath/to/xxx\fP が存在する場合にファイル \fIpath/to/xxx.dep\fP を作成したいとする。 +問題は、存在確認とファイル作成の間に、 \fIpath\fP や \fIto\fP (シンボリックリンクでもよい) +が別の場所を指すように変更されることがあるということだ。 このような競合条件は、 対象のディレクトリに対するファイルディスクリプタをオープンし、 +それから \fBfstatat\fP(2) や \fBopenat\fP() の \fIdirfd\fP 引き数としてそのファイルディスクリプタを指定することで、 +避けることができる。 + +.\" +.\" +二つ目として、 \fBopenat\fP() を使うと、アプリケーションが管理するファイルディスクリプタにより、 +スレッド単位の「カレントワーキングディレクトリ」を実装することができる (この機能は、 \fI/proc/self/fd/dirfd\fP +を使った方法でも実現することができるが、 効率の面で落とる)。 .SS O_DIRECT .LP \fBO_DIRECT\fP フラグを使用する場合、ユーザ空間バッファの長さやアドレス、 I/O @@ -513,8 +717,12 @@ UID マッピングを使用している NFS ファイルシステムでは、 \ いくつかのファイルシステムでは、制限を確認するための独自のインタフェースが 提供されている。例えば、 \fBxfsctl\fP(3) の \fBXFS_IOC_DIOINFO\fP 命令である。 .LP -Linux 2.4 では、転送サイズ、 ユーザーバッファのアラインメント、ファイルオフセットは、 -ファイルシステムの論理ブロックサイズの倍数でなければならない。 Linux 2.6 では、512 バイトごとの境界に配置されていれば充分である。 +Linux 2.4 では、転送サイズ、 ユーザーバッファのアライメント、ファイルオフセットは、 +ファイルシステムの論理ブロックサイズの倍数でなければならない。 Linux 2.6.0 以降では、 +内部で使われるストレージの論理ブロックサイズのアライメント (通常は 512 バイト) で十分である。 論理ブロックサイズは \fBioctl\fP(2) +\fBBLKSSZGET\fP 操作や以下のシェルコマンドから知ることができる。 + + blockdev \-\-getss .LP メモリバッファがプライベートマッピング (\fBmmap\fP(2) の \fBMAP_PRIVATE\fP フラグで作成されたマッピング) の場合には、\fBO_DIRECT\fP I/O は @@ -567,12 +775,11 @@ NFS で \fBO_DIRECT\fP を使った場合の動作はローカルのファイル .\" See http://bugzilla.kernel.org/show_bug.cgi?id=5993 現在のところ、 \fBopen\fP() の呼び出し時に \fBO_ASYNC\fP を指定してシグナル駆動 I/O を有効にすることはできない。 このフラグを有効にするには \fBfcntl\fP(2) を使用すること。 + +カーネルが \fBO_TMPFILE\fP 機能をサポートしているかを判定する際に、 \fBEISDIR\fP と \fBENOENT\fP の 2 +つのエラーコードをチェックしなければならない。 .SH 関連項目 \fBchmod\fP(2), \fBchown\fP(2), \fBclose\fP(2), \fBdup\fP(2), \fBfcntl\fP(2), \fBlink\fP(2), -\fBlseek\fP(2), \fBmknod\fP(2), \fBmmap\fP(2), \fBmount\fP(2), \fBopenat\fP(2), \fBread\fP(2), -\fBsocket\fP(2), \fBstat\fP(2), \fBumask\fP(2), \fBunlink\fP(2), \fBwrite\fP(2), -\fBfopen\fP(3), \fBfifo\fP(7), \fBpath_resolution\fP(7), \fBsymlink\fP(7) -.SH この文書について -この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.54 の一部 -である。プロジェクトの説明とバグ報告に関する情報は -http://www.kernel.org/doc/man\-pages/ に書かれている。 +\fBlseek\fP(2), \fBmknod\fP(2), \fBmmap\fP(2), \fBmount\fP(2), \fBopen_by_handle_at\fP(2), +\fBread\fP(2), \fBsocket\fP(2), \fBstat\fP(2), \fBumask\fP(2), \fBunlink\fP(2), +\fBwrite\fP(2), \fBfopen\fP(3), \fBfifo\fP(7), \fBpath_resolution\fP(7), \fBsymlink\fP(7)