1 .\" Copyright (C) 2014 Michael Kerrisk <mtk.manpages@gmail.com>
2 .\" and Copyright (C) 2014 David Herrmann <dh.herrmann@gmail.com>
4 .\" %%%LICENSE_START(GPLv2+)
5 .\" This program is free software; you can redistribute it and/or modify
6 .\" it under the terms of the GNU General Public License as published by
7 .\" the Free Software Foundation; either version 2 of the License, or
8 .\" (at your option) any later version.
10 .\" This program is distributed in the hope that it will be useful,
11 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
12 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 .\" GNU General Public License for more details.
15 .\" You should have received a copy of the GNU General Public
16 .\" License along with this manual; if not, see
17 .\" <http://www.gnu.org/licenses/>.
20 .\"*******************************************************************
22 .\" This file was generated with po4a. Translate the source file.
24 .\"*******************************************************************
25 .TH MEMFD_CREATE 2 2014\-07\-08 Linux "Linux Programmer's Manual"
27 memfd_create \- 無名ファイル (anonymous file) を作成する
29 \fB#include <sys/memfd.h>\fP
31 \fBint memfd_create(const char *\fP\fIname\fP\fB, unsigned int \fP\fIflags\fP\fB);\fP
34 .\" memfd uses VM_NORESERVE so each page is accounted on first access.
35 .\" This means, the overcommit-limits (see __vm_enough_memory()) and the
36 .\" memory-cgroup limits (mem_cgroup_try_charge()) are applied. Note that
37 .\" those are accounted on "current" and "current->mm", that is, the
38 .\" process doing the first page access.
39 \fBmemfd_create\fP() は、 無名ファイル (anonymous file) を作成し、
40 そのファイルを参照するファイルディスクリプターを返す。 このファイルは通常のファイルと同様に振る舞い、 変更、切り詰め (truncate)、
41 メモリーマップなどを行うことができる。 しかし、 通常のファイルとは違い、 このファイルは RAM 上に置かれ、 格納されるストレージは揮発性である。
42 このファイルへの参照がすべてなくなると、 ファイルは自動的に解放される。 このファイルが置かれるページには無名メモリー (anonymous
43 memory) が使用される。 したがって、 \fBmemfd_create\fP() で作成されたフィアルは、 他の無名メモリーの割り当て
44 (\fBMAP_ANONYMOUS\fP フラグ付きの \fBmmap\fP(2) を使って割り当てられた無名メモリーなど) と同じ動作をする。
46 ファイルの初期サイズは 0 に設定される。 呼び出しの後に、 \fBftruncate\fP(2) を使ってファイルサイズを設定すべきである (代わりに、
47 \fBwrite\fP(2) や同様の関数を呼び出してファイルにデータを書き込むこともできる)。
49 \fIname\fP に指定された名前はファイル名として使用され、 ディレクトリ \fI/proc/self/fd/\fP
50 で対応するシンボリックリンクのリンク先として表示される。 表示される名前の前には常に \fImemfd:\fP が付き、
51 この名前はデバッグ用途としてのみ機能する。 名前はファイルディスクリプターの動作には影響せず、 複数のファイルが同じ名前を持っても副作用はない。
53 以下の値をビット論理和で \fIflags\fP に指定して、 \fBmemfd_create\fP() の動作を変更できる。
56 新しいファイルディスクリプターに close\-on\-exec (\fBFD_CLOEXEC\fP) フラグをセットする。 これが有用な理由については
57 \fBopen\fP(2) の \fBO_CLOEXEC\fP フラグの説明を参照のこと。
59 \fBMFD_ALLOW_SEALING\fP
60 .\" FIXME Why is the MFD_ALLOW_SEALING behavior not simply the default?
61 .\" Is it worth adding some text explaining this?
62 このファイルに対して sealing 操作を許可する。 \fBfcntl\fP(2) の \fBF_ADD_SEALS\fP と \fBF_GET_SEALS\fP
63 操作の議論を参照。 下記の「注意」も参照。 初期の seal 集合は空となる。 このフラグを指定しなかった場合、 初期の seal 集合は
64 \fBF_SEAL_SEAL\fP となり、 これはこのファイルには他の seal をセットできないことということである。
66 \fIflags\fP の未使用のビットは 0 でなければならない。
68 返り値として \fBmemfd_create\fP() は、 作成したファイルを参照するのに使用できる新しいファイルディスクリプターを返す。
69 このファイルディスクリプターは読み書き両用 (\fBO_RDWR\fP) でオープンされ、 \fBO_LARGEFILE\fP
70 がこのファイルディスクリプターにセットされる。
72 \fBfork\fP(2) と \fBexecve\fP(2) に関しては、 \fBmemfd_create\fP()
73 で作成したファイルディスクリプターについても通常の動作が適用される。 ファイルディスクリプターのコピーは \fBfork\fP(2)
74 で生成される子プロセスに継承され、 同じファイルを参照する。 close\-on\-exec フラグがセットされていない限り、 \fBexecve\fP(2)
75 の前後でファイルディスクリプターは保持される。
77 成功の場合、 \fBmemfd_create\fP() は新しいファイルディスクリプターを返す。 エラーの場合、\-1 を返し、 \fIerrno\fP
82 \fIname\fP のアドレスが無効なメモリーを指している。
85 サポートされていない値がいずれかの引き数で指定された。 \fIflags\fP に未知のビットが含まれていたか、 \fIname\fP が長過ぎた。
88 オープンされているファイルディスクリプターのプロセス単位の上限に達した。
91 システム全体でオープンされているファイルの総数が上限に達した。
94 新しい無名ファイルを作成するのに十分なメモリがなかった。
96 .\" FIXME . When glibc support appears, update the following sentence:
97 \fBmemfd_create\fP() システムコールは Linux 3.17 で初めて登場した。 GNU C ライブラリでのサポートは検討中である。
99 \fBmemfd_create\fP() システムコールは Linux 固有である。
101 .\" See also http://lwn.net/Articles/593918/
102 .\" and http://lwn.net/Articles/594919/ and http://lwn.net/Articles/591108/
103 \fBmemfd_create\fP() システムコールは、 手動で \fItmpfs\fP ファイルシステムをマウントして、
104 そのファイルシステムにファイルをオープンするという操作の、 簡単な代替手段を提供している。 \fBmemfd_create\fP() の主な目的は、
105 \fBfcntl\fP(2) が提供する file\-sealing API で使用できる、
106 ファイルとそれに関連付けられるファイルディスクリプターを作成することである。
108 \fBmemfd_create\fP() システムコールは、 file sealing なしでも用途がある (これが明示的に
109 \fBMFD_ALLOW_SEALING\fP フラグが要求されない限り、 file\-sealing が無効になる理由である)。 特に、
110 ファイルシステムに実際にファイルを残す意図がない場合、 \fItmp\fP にファイルを作成したり \fBopen\fP(2) \fBO_TMPFILE\fP
111 を使ったりする際の代替手段として使用できる。
113 file sealing がない場合、 共有メモリ経由で通信するプロセスは、 互いに信頼するか、
114 信頼していない相手が共有メモリ領域を問題がある方法で操作する可能性に対処するための対策を講じなければならない。
115 例えば、 信頼していない相手は、 いつでも共有メモリの内容を変更したり、 共有メモリ領域を縮小したりする可能性がある。 前者の場合は、
116 ローカルプロセスでは、 データの確認時点と使用時点の競合条件の問題が起こり得る
117 (通常はこの問題への対処は共有メモリ領域からデータをこぴーしてからデータを確認、使用することである)。 後者の場合は、 ローカルプロセスでは、
118 共有メモリ領域の存在しなくなった場所にアクセスしようとした際にシグナル \fBSIGBUS\fP が発生する可能性がある (この可能性に対処するにはシグナル
119 \fBSIGBUS\fP に対してハンドラーを使用する必要がある)。
121 信頼していない相手への対処により、 共有メモリを利用するコードに余計な複雑性が増すことになる。 メモリー sealing
122 により余計な複雑性をなくすことができる。 相手が望まない方法で共有メモリを変更できないことを知っていることで、 プロセスは安全に動作できるようになる。
124 sealing 機構の使い方の例は以下のとおりである。
127 最初のプロセスは \fBmemfd_create\fP() を使って \fItmpfs\fP ファイルを作成する。 \fBmemfd_create\fP()
128 はこれ以降のステップで使用するファイルディスクリプターを返す。
130 最初のプロセスは \fBftruncate\fP(2) を使って直前のステップで作成したファイルのサイズを変更し、 \fBmmap\fP(2)
131 を使ってそのファイルをマッピングし、 共有メモリに所望のデータを配置する。
133 最初のプロセスは、 このファイルに対する今後の変更を制限するために、 \fBfcntl\fP(2) の \fBF_ADD_SEALS\fP 操作を使って、
134 そのファイルに seal をいくつか設定する。 (seal \fBF_SEAL_WRITE\fP を設定する場合、
135 直前のステップで作成した書き込み可能な共有マッピングをまずアンマップする必要が出てくる。)
137 二つ目のプロセスは \fItmpfs\fP ファイルのファイルディスクリプターを入手し、 そのファイルをマップする。 以下に示す方法を使用することができる。
140 \fBmemfd_create\fP() を呼び出したプロセスは、 得られたファイルディスクリプターを二つ目のプロセスに UNIX
141 ドメインソケット経由で渡すことができる (\fBunix\fP(7) と \fBcmsg\fP(3) を参照)。 それから、二つ目のプロセスは \fBmmap\fP(2)
144 二つ目のプロセスを \fBfork\fP(2) を使って作成する。 そうすると、 自動的にファイルディスクリプターとマッピングが継承される。
145 (この方法と次の方法では、 二つのプロセス間で自然な信頼関係が存在することになる。 なぜなら、 二つのプロセスは同じユーザー ID。
146 の元で実行されているからである。 したがって、 file sealing は通常は不要であろう。)
148 二つ目のプロセスは \fI/proc/<pd>/fd/<fd>\fP をオープンする。 \fI<pid>\fP
149 は最初のプロセス (\fBmemfd_create\fP() を呼び出したプロセス) の PID で、 \fI<fd>\fP は最初のプロセスでの
150 \fBmemfd_create\fP() の呼び出しで返されたファイルディスクリプター番号である。 それからこのファイルを \fBmmap\fP(2)
154 二つ目のプロセスは \fBfcntl\fP(2) の \fBF_GET_SEALS\fP 操作を使って、 そのファイルに適用されている seal
155 のビットマスクを取得する。 このビットマスクを調べて、 ファイルの変更に関してどのような制限が適用されているかを知ることができる。
156 (\fBF_SEAL_SEAL\fP seal がそれまでに適用されていない限りは) 必要であれば、 二つ目のプロセスはさらに seal
157 を設定して追加の制限をかけることができる。
159 以下では \fBmemfd_create\fP() と file sealing API の使用例を示すサンプルプログラムを 2 つとりあげる。
161 最初のプログラム \fIt_memfd_create.c\fP は、 \fBmemfd_create\fP() を使って \fItmpfs\fP ファイルを作成し、
162 そのファイルのサイズを設定し、 メモリにマッピングし、 要求された場合にはそのファイルに seal を設定する。 このプログラムは最大で 3
163 つのコマンドライン引き数を取り、 最初の 2 つは必須である。 最初の引き数はファイルに関連付けられる名前で、 2
164 番目の引き数はファイルに設定されるサイズである。 省略可能な 3 番目の引き数は、 このファイルに設定する seal を指定する文字列である。
166 2 つめのプログラム \fIt_get_seals.c\fP を使うと、 \fBmemfd_create\fP() を使って作成された既存のファイルをオープンし、
167 そのファイルに適用されている seal の集合を調査できる。
169 以下のシェルのセッションはこれらのプログラムの使用例を示したものである。 まず \fItmpfs\fP ファイルを作成し、そのファイルに seal
174 $ \fB./t_memfd_create my_memfd_file 4096 sw &\fP
176 PID: 11775; fd: 3; /proc/11775/fd/3
180 この時点では、 \fIt_memfd_create\fP プログラムはバックグラウンドで動作し続ける。 もう一つのプログラムから、
181 \fBmemfd_create\fP() がオープンしたディスクリプターに対応する \fI/proc/PID/fd\fP ファイルをオープンすることで、
182 \fBmemfd_create\fP() で作成されたファイルのファイルディスクリプターを取得できる。
183 そのパス名を使って、 \fI/proc/PID/fd\fP シンボリックリンクの内容を調査し、 \fIt_get_seals\fP
184 プログラムを使ってそのファイルに設定されている seal を見ることができる。
188 $ \fBreadlink /proc/11775/fd/3\fP
189 /memfd:my_memfd_file (deleted)
190 $ \fB./t_get_seals /proc/11775/fd/3\fP
191 Existing seals: WRITE SHRINK
194 .SS "プログラムのソース: t_memfd_create.c"
197 #include <sys/memfd.h>
204 #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \e
208 main(int argc, char *argv[])
213 char *name, *seals_arg;
217 fprintf(stderr, "%s name size [seals]\en", argv[0]);
218 fprintf(stderr, "\et\(aqseals\(aq can contain any of the "
219 "following characters:\en");
220 fprintf(stderr, "\et\etg \- F_SEAL_GROW\en");
221 fprintf(stderr, "\et\ets \- F_SEAL_SHRINK\en");
222 fprintf(stderr, "\et\etw \- F_SEAL_WRITE\en");
223 fprintf(stderr, "\et\etS \- F_SEAL_SEAL\en");
231 /* Create an anonymous file in tmpfs; allow seals to be
232 placed on the file */
234 fd = memfd_create(name, MFD_ALLOW_SEALING);
236 errExit("memfd_create");
238 /* Size the file as specified on the command line */
240 if (ftruncate(fd, len) == \-1)
243 printf("PID: %ld; fd: %d; /proc/%ld/fd/%d\en",
244 (long) getpid(), fd, (long) getpid(), fd);
246 /* Code to map the file and populate the mapping with data
249 /* If a \(aqseals\(aq command\-line argument was supplied, set some
252 if (seals_arg != NULL) {
255 if (strchr(seals_arg, \(aqg\(aq) != NULL)
256 seals |= F_SEAL_GROW;
257 if (strchr(seals_arg, \(aqs\(aq) != NULL)
258 seals |= F_SEAL_SHRINK;
259 if (strchr(seals_arg, \(aqw\(aq) != NULL)
260 seals |= F_SEAL_WRITE;
261 if (strchr(seals_arg, \(aqS\(aq) != NULL)
262 seals |= F_SEAL_SEAL;
264 if (fcntl(fd, F_ADD_SEALS, seals) == \-1)
268 /* Keep running, so that the file created by memfd_create()
269 continues to exist */
276 .SS "プログラムのソース: t_get_seals.c"
279 #include <sys/memfd.h>
286 #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \e
290 main(int argc, char *argv[])
296 fprintf(stderr, "%s /proc/PID/fd/FD\en", argv[0]);
300 fd = open(argv[1], O_RDWR);
304 seals = fcntl(fd, F_GET_SEALS);
308 printf("Existing seals:");
309 if (seals & F_SEAL_SEAL)
311 if (seals & F_SEAL_GROW)
313 if (seals & F_SEAL_WRITE)
315 if (seals & F_SEAL_SHRINK)
319 /* Code to map the file and access the contents of the
320 resulting mapping omitted */
326 \fBfcntl\fP(2), \fBftruncate\fP(2), \fBmmap\fP(2), \fBshmget\fP(2), \fBshm_open\fP(3)