OSDN Git Service

(split) Convert release and draft pages to UTF-8.
[linuxjm/LDP_man-pages.git] / release / man2 / fcntl.2
1 '\" t
2 .\" Hey Emacs! This file is -*- nroff -*- source.
3 .\"
4 .\" This manpage is Copyright (C) 1992 Drew Eckhardt;
5 .\"                 and Copyright (C) 1993 Michael Haardt, Ian Jackson;
6 .\"                 and Copyright (C) 1998 Jamie Lokier;
7 .\"                 and Copyright (C) 2002 Michael Kerrisk.
8 .\"
9 .\" Permission is granted to make and distribute verbatim copies of this
10 .\" manual provided the copyright notice and this permission notice are
11 .\" preserved on all copies.
12 .\"
13 .\" Permission is granted to copy and distribute modified versions of this
14 .\" manual under the conditions for verbatim copying, provided that the
15 .\" entire resulting derived work is distributed under the terms of a
16 .\" permission notice identical to this one.
17 .\"
18 .\" Since the Linux kernel and libraries are constantly changing, this
19 .\" manual page may be incorrect or out-of-date.  The author(s) assume no
20 .\" responsibility for errors or omissions, or for damages resulting from
21 .\" the use of the information contained herein.  The author(s) may not
22 .\" have taken the same level of care in the production of this manual,
23 .\" which is licensed free of charge, as they might when working
24 .\" professionally.
25 .\"
26 .\" Formatted or processed versions of this manual, if unaccompanied by
27 .\" the source, must acknowledge the copyright and authors of this work.
28 .\"
29 .\" Modified 1993-07-24 by Rik Faith <faith@cs.unc.edu>
30 .\" Modified 1995-09-26 by Andries Brouwer <aeb@cwi.nl>
31 .\" and again on 960413 and 980804 and 981223.
32 .\" Modified 1998-12-11 by Jamie Lokier <jamie@imbolc.ucc.ie>
33 .\" Applied correction by Christian Ehrhardt - aeb, 990712
34 .\" Modified 2002-04-23 by Michael Kerrisk <mtk.manpages@gmail.com>
35 .\"     Added note on F_SETFL and O_DIRECT
36 .\"     Complete rewrite + expansion of material on file locking
37 .\"     Incorporated description of F_NOTIFY, drawing on
38 .\"             Stephen Rothwell's notes in Documentation/dnotify.txt.
39 .\"     Added description of F_SETLEASE and F_GETLEASE
40 .\" Corrected and polished, aeb, 020527.
41 .\" Modified 2004-03-03 by Michael Kerrisk <mtk.manpages@gmail.com>
42 .\"     Modified description of file leases: fixed some errors of detail
43 .\"     Replaced the term "lease contestant" by "lease breaker"
44 .\" Modified, 27 May 2004, Michael Kerrisk <mtk.manpages@gmail.com>
45 .\"     Added notes on capability requirements
46 .\" Modified 2004-12-08, added O_NOATIME after note from Martin Pool
47 .\" 2004-12-10, mtk, noted F_GETOWN bug after suggestion from aeb.
48 .\" 2005-04-08 Jamie Lokier <jamie@shareable.org>, mtk
49 .\"     Described behavior of F_SETOWN/F_SETSIG in
50 .\"     multithreaded processes, and generally cleaned
51 .\"     up the discussion of F_SETOWN.
52 .\" 2005-05-20, Johannes Nicolai <johannes.nicolai@hpi.uni-potsdam.de>,
53 .\"     mtk: Noted F_SETOWN bug for socket file descriptor in Linux 2.4
54 .\"     and earlier.  Added text on permissions required to send signal.
55 .\" 2009-09-30, Michael Kerrisk
56 .\"     Note obsolete F_SETOWN behavior with threads.
57 .\"     Document F_SETOWN_EX and F_GETOWN_EX
58 .\"
59 .\" Japanese Version Copyright (c) 1996 Takeshi Ueno
60 .\" and Copyright (c) 2005, 2006, 2008 Akihiro MOTOKI
61 .\"
62 .\" Translated 1996-07-03, Takeshi Ueno <tueno@vio.co.jp>
63 .\" Modified 1998-09-10, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
64 .\" Modified 1999-08-14, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
65 .\" Updated & Modified 2001-04-03, Yuichi SATO <ysato@h4.dion.ne.jp>
66 .\" Updated & Modified 2005-03-15, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
67 .\" Updated & Modified 2005-04-22, Akihiro MOTOKI
68 .\" Updated & Modified 2005-10-14, Akihiro MOTOKI
69 .\" Updated & Modified 2005-11-19, Akihiro MOTOKI, LDP v2.14
70 .\" Updated 2006-04-16, Akihiro MOTOKI, LDP v2.29
71 .\" Updated 2008-02-11, Akihiro MOTOKI, LDP v2.77
72 .\" Updated 2008-09-19, Akihiro MOTOKI, LDP v3.09
73 .\" Updated 2010-04-23, Akihiro MOTOKI, LDP v3.24
74 .\"
75 .\"WORD:        asynchronous I/O        非同期 I/O
76 .\"WORD:        descriptor              ディスクリプタ
77 .\"WORD:        open file description   オープンファイル記述
78 .\"WORD:        feature test macro      機能検査マクロ
79 .\"WORD:        I/O availability signal I/O が利用可能になったことを示すシグナル
80 .\"
81 .TH FCNTL 2 2009-10-17 "Linux" "Linux Programmer's Manual"
82 .SH 名前
83 fcntl \- ファイルディスクリプタの操作を行う
84 .SH 書式
85 .nf
86 .B #include <unistd.h>
87 .B #include <fcntl.h>
88 .sp
89 .BI "int fcntl(int " fd ", int " cmd ", ... /* " arg " */ );"
90 .fi
91 .SH 説明
92 .BR fcntl ()
93 は、オープンされたファイルディスクリプタ
94 .I fd
95 に関して下記の操作を行う。操作は
96 .I cmd
97 によって決まる:
98
99 .BR fcntl ()
100 はオプションとして第三引き数をとることができる。
101 第三引き数が必要かどうかは
102 .I cmd
103 により決まる。
104 必要な引き数の型は
105 .I cmd
106 名の後ろの括弧内で指定されている
107 (ほとんどの場合、必要な型は
108 .I long
109 であり、この引き数を表すのに
110 .I arg
111 という名前を使っている)。
112 引き数が必要ない場合には
113 .I void
114 が指定されている。
115 .SS "ファイルディスクリプタの複製"
116 .TP
117 .BR F_DUPFD " (\fIlong\fP)"
118 利用可能なファイルディスクリプタのうち、
119 .I arg
120 以上で最小のものを探し、
121 .I fd
122 のコピーとする。これは別の形の
123 .BR dup2 (2)
124 である。
125 .BR dup2 (2)
126 では指定されたディスクリプタが使われる点が違う。
127 .IP
128 成功すると、新しいディスクリプタが返される。
129 .IP
130 詳細は
131 .BR dup (2)
132 を参照のこと。
133 .TP
134 .BR F_DUPFD_CLOEXEC " (\fIlong\fP; Linux 2.6.24 以降)"
135 .B F_DUPFD
136 と同様だが、それに加えて複製されたディスクリプタに対して
137 close-on-exec フラグをセットする。
138 このフラグを指定することで、プログラムは
139 .B FD_CLOEXEC
140 フラグをセットするために
141 .BR fcntl ()
142
143 .B F_SETFD
144 操作を追加で行う必要がなくなる。
145 このフラグがなぜ有用かについては、
146 .BR open (2)
147
148 .B O_CLOEXEC
149 の説明を参照のこと。
150 .SS "ファイルディスクリプタ・フラグ"
151 以下のコマンドを使って、ファイルディスクリプタに関連するフラグ
152 を操作することができる。
153 現在のところ、定義されているフラグは一つだけである:
154 .B FD_CLOEXEC
155 (close-on-exec フラグ)。
156 .B FD_CLOEXEC
157 ビットが 0 なら、ファイルディスクリプタは
158 .BR execve (2)
159 を行ってもオープンされたままだが、そうでない場合はクローズされる。
160 .TP
161 .BR F_GETFD " (\fIvoid\fP)"
162 ファイルディスクリプタ・フラグを読み出す。
163 .I arg
164 は無視される。
165 .TP
166 .BR F_SETFD " (\fIlong\fP)"
167 ファイルディスクリプタ・フラグに
168 .I arg
169 で指定した値を設定する。
170 .SS "ファイル状態フラグ"
171 オープンファイル記述 (open file description) には、
172 ファイル記述毎に設定される状態フラグがいくつかある。これらのフラグは
173 .BR open (2)
174 .\" や
175 .\" .BR creat (2)
176 によって初期化され、
177 .BR fcntl (2)
178 により変更することもできる。これらは、
179 .RB ( dup (2),
180 .BR fcntl (F_DUPFD),
181 .BR fork (2)
182 などで) 複製されたファイルディスクリプタ同士は
183 同じオープンファイル記述を参照する。
184 そのため、
185 同じファイル状態フラグが共有される。
186
187 ファイル状態フラグとその意味は
188 .BR open (2)
189 で説明されている。
190 .TP
191 .BR F_GETFL " (\fIvoid\fP)"
192 ファイル状態フラグを読み出す。
193 .I arg
194 は無視される。
195 .TP
196 .BR F_SETFL " (\fIlong\fP)"
197 ファイル状態フラグに
198 .I arg
199 で指定された値を設定する。
200 .I arg
201 のうち、ファイルのアクセスモード
202 .RB ( O_RDONLY ", " O_WRONLY ", " O_RDWR )
203 とファイル作成フラグ (すなわち
204 .BR O_CREAT ", " O_EXCL ", " O_NOCTTY ", " O_TRUNC )
205 に関するビットは無視される。
206 Linux では、このコマンドで変更できるのは
207 .BR O_APPEND ,
208 .BR O_ASYNC ,
209 .BR O_DIRECT ,
210 .BR O_NOATIME ,
211 .B O_NONBLOCK
212 フラグだけである。
213 .\" FIXME . POSIX.1-2001 によると、 O_SYNC も fcntl(2) で変更できるべきだが、
214 .\" 現在のところ Linux では許可されていない。
215 .\" http://bugzilla.kernel.org/show_bug.cgi?id=5994 参照
216 .SS "アドバイザリ・ロック"
217 .BR F_GETLK ", " F_SETLK ", " F_SETLKW
218 は、レコード・ロックの獲得/解放/テストのために使用する
219 (レコード・ロックはファイルセグメント・ロックや
220 ファイル領域ロックとも呼ばれる)。
221 三番目の引き数
222 .I lock
223 は、以下に示すフィールドを含む構造体へのポインタである
224 (フィールドの順序は関係なく、構造体に他のフィールドがあってもよい)。
225 .in +4n
226 .nf
227 .sp
228 struct flock {
229     ...
230     short l_type;    /* Type of lock: F_RDLCK,
231                         F_WRLCK, F_UNLCK */
232     short l_whence;  /* How to interpret l_start:
233                         SEEK_SET, SEEK_CUR, SEEK_END */
234     off_t l_start;   /* Starting offset for lock */
235     off_t l_len;     /* Number of bytes to lock */
236     pid_t l_pid;     /* PID of process blocking our lock
237                         (F_GETLK only) */
238     ...
239 };
240 .fi
241 .in
242 .P
243 この構造体の
244 .IR l_whence ", " l_start ", " l_len
245 フィールドで、ロックを行いたいバイト範囲を指定する。
246 ファイルの末尾より後ろのバイトをロックすることはできるが、
247 ファイルの先頭より前のバイトをロックすることはできない。
248
249 .I l_start
250 はロックを行う領域の開始オフセットである。
251 その意味は
252 .I l_whence
253 により異なる:
254 .I l_whence
255
256 .B SEEK_SET
257 の場合はファイルの先頭からのオフセット、
258 .I l_whence
259
260 .B SEEK_CUR
261 の場合は現在のファイルオフセットからのオフセット、
262 .I l_whence
263
264 .B SEEK_END
265 の場合はファイルの末尾からのオフセットと解釈される。
266 後ろの2つの場合には、
267 ファイルの先頭より前にならない範囲で、
268 .I l_start
269 に負の値を指定することができる。
270
271 .I l_len
272 はロックしたいバイト数を示す。
273 .I l_len
274 が正の場合、ロックされるバイト範囲は
275 .I l_start
276 以上
277 .IR l_start + l_len \- 1
278 以下となる。
279 .I l_len
280 に 0 を指定した場合は特別な意味を持つ:
281 .IR l_whence " and " l_start
282 で指定される位置からファイルの末尾までの全てのバイトをロックする
283 (ファイルがどんなに大きくなったとしてもファイルの末尾までロックする)。
284
285 POSIX.1-2001 では、負の値の
286 .I l_len
287 をサポートする実装を認めている (必須ではない)。
288 .I l_len
289 が負の場合、ロックされるバイト範囲は
290 .IR l_start + l_len
291 以上
292 .IR l_start \-1
293 以下となる。
294 この動作はカーネル 2.4.21 以降および 2.5.49 以降の Linux で
295 サポートされている。
296
297 .I l_type
298 フィールドは、ファイルに対して読み出しロック
299 .RB ( F_RDLCK )
300 と書き込みロック
301 .RB ( F_WRLCK )
302 のどちらを
303 設定するかを指定する。
304 ファイルのある領域に対して、読み出しロック (共有ロック) を保持できる
305 プロセス数に制限はないが、書き込みロック (排他ロック) を保持できる
306 のは一つのプロセスだけである。排他ロックを設定すると、(共有ロックか
307 排他ロックにかかわらず) 他のロックは何も設定できない。
308 一つのプロセスは、ファイルのある領域に対して一種類のロックしか保持できない。
309 新規のロックがロックが設定されている領域に対して適用されると、既存のロック
310 は新規のロックの種別に変換される
311 (新規のロックで指定されたバイト範囲が既存ロックの範囲と一致する場合以外では、
312 変換の過程で既存のロックの分割、縮小、結合が行われることがある)。
313 .TP
314 .BR F_SETLK " (\fIstruct flock *\fP)"
315 .RI ( l_type
316
317 .B F_RDLCK
318
319 .B F_WRLCK
320 の場合は) ロックの獲得を、
321 .RB ( F_UNLCK
322 の場合は) ロックの解放を、
323 .I flock
324 構造体のフィールド
325 .IR l_whence ", " l_start ", " l_len
326 で指定された範囲のバイトに対して行う。
327 指定されたロックが他のプロセスが設定しているロックと衝突する場合は、
328 \-1 を返し、
329 .I errno
330
331 .B EACCES
332
333 .B EAGAIN
334 を設定する。
335 .TP
336 .BR F_SETLKW " (\fIstruct flock *\fP)"
337 .B F_SETLK
338 と同様だが、こちらではそのファイルに対して衝突するロックが
339 適用されていた場合に、そのロックが解放されるのを待つ点が異なる。
340 待っている間にシグナルを受けた場合は、システムコールは中断され、
341 (シグナルハンドラが戻った直後に) 返り値 \-1 を返す (また
342 .I errno
343
344 .B EINTR
345 が設定される;
346 .BR signal (7)
347 参照)。
348 .TP
349 .BR F_GETLK " (\fIstruct flock *\fP)"
350 このコールの呼び出し時には、
351 .I lock
352 にはそのファイルに適用しようとするロックに関する情報が入っている。
353 ロックを適用できる場合には、
354 .BR fcntl ()
355 は実際にはロックを行わず、構造体
356 .I lock
357
358 .I l_type
359 フィールドに
360 .B F_UNLCK
361 を設定し、他のフィールドは変更せずに、復帰する。
362 違う種別のロックが (一つもしくは複数) 適用されていて
363 ロックを適用できないような場合には、
364 .BR fcntl ()
365 は、原因となったロックの一つについての詳細情報を構造体
366 .I lock
367 のフィールド
368 .IR l_type ", " l_whence ", " l_start ", " l_len
369 に格納し、また
370 .I l_pid
371 にロックを保持しているプロセスの PID を設定して、復帰する。
372 .P
373 読み出しロックを適用するには、
374 .I fd
375 は読み出し用にオープンされていなければならない。
376 書き込みロックを適用するには、
377 .I fd
378 は書き込み用にオープンされていなければならない。
379 読み書き両方のロックを適用するには、読み書き両用で
380 ファイルをオープンしなければならない。
381 .P
382 レコードのロックは、
383 .B F_UNLCK
384 により明示的に削除されるだけでなく、
385 プロセスが終了したときや、ロックが適用されているファイルを参照している
386 ファイルディスクリプタのいずれかがクローズされた場合にも解放される。
387 このロックの解放は自動的に行われる。
388 .\" .RB ( open "(2), " dup "(2), " dup2 "(2), " fcntl ()
389 .\" の呼び出しによって同じファイルを参照するファイルディスクリプタが
390 .\" 他にもできているかもしれない)
391 この動作はまずい: あるプロセスが
392 .I /etc/passwd
393
394 .I /etc/mtab
395 といったファイルにロックを適用しているときに、
396 あるライブラリ関数が何かの理由で同じファイルを open, read, close
397 すると、そのファイルへのロックが失われることになる。
398 .P
399 レコードのロックは
400 .BR fork (2)
401 で作成された子プロセスには継承されないが、
402 .BR execve (2)
403 の前後では保存される。
404 .P
405 .BR stdio (3)
406 ではバッファリングが行われるので、
407 stdio 関連の関数ではレコードのロックの使用は回避される;
408 代わりに
409 .BR read (2)
410
411 .BR write (2)
412 を使用すること。
413 .SS "強制ロック (mandatory locking)"
414 上述のロックにはアドバイザリ・ロック (advisory lock) と強制ロック (mandatory
415 lock) の二種類があるが、デフォルトではアドバイザリ・ロックとなる。
416
417 アドバイザリ・ロックに強制力はなく、協調して動作するプロセス間でのみ
418 有効である。
419
420 強制ロックは全てのプロセスに対して効果がある。
421 あるプロセスが互換性のない強制ロックが適用されたファイル領域に対して
422 .RB ( read (2)
423
424 .BR write (2)
425 により) 互換性のないアクセスを実行しようとした場合、
426 アクセスの結果は
427 そのファイルのオープンファイル記述で
428 .B O_NONBLOCK
429 フラグが有効になっているかにより決まる。
430 .B O_NONBLOCK
431 フラグが有効になっていないときは、ロックが削除されるか、
432 ロックがアクセスと互換性のあるモードに変換されるまで、
433 システムコールは停止 (block) される。
434 .B O_NONBLOCK
435 フラグが有効になっているときは、システムコールはエラー
436 .B EAGAIN
437 で失敗する。
438
439 強制ロックを使用するためには、ロック対象のファイルが含まれるファイルシステム
440 と、ロック対象のファイル自身の両方について、強制ロックが有効になっていなけれ
441 ばならない。ファイルシステムについて強制ロックを有効にするには、
442 .BR mount (8)
443 に "\-o mand" オプションを渡すか、
444 .BR mount (2)
445
446 .B MS_MANDLOCK
447 フラグを指定する。ファイルについて強制ロックを有効にするには、
448 そのファイルのグループ実行許可 (group execute permission) を無効とし、
449 かつ set-group-ID 許可ビットを有効にする
450 .RB ( chmod (1)
451
452 .BR chmod (2)
453 を参照)。
454
455 Linux の強制ロックの実装は信頼性に欠けるものである。
456 下記の「バグ」の節を参照のこと。
457 .SS "シグナルの管理"
458 .BR F_GETOWN ,
459 .BR F_SETOWN ,
460 .BR F_GETOWN_EX ,
461 .BR F_SETOWN_EX ,
462 .BR F_GETSIG ,
463 .B F_SETSIG
464 は、I/O が利用可能になったことを示すシグナルを管理するために使用される。
465 .TP
466 .BR F_GETOWN " (\fIvoid\fP)"
467 ファイルディスクリプタ
468 .I fd
469 のイベントに対するシグナル
470 .B SIGIO
471 および
472 .B SIGURG
473 を受けているプロセスのプロセスID かプロセスグループを
474 (関数の結果として) 返す。
475 プロセスID は正の値として返される。
476 プロセスグループID は負の値として返される (下記のバグの章を参照)。
477 .I arg
478 は無視される。
479 .TP
480 .BR F_SETOWN " (\fIlong\fP)"
481 ファイルディスクリプタ
482 .I fd
483 のイベント発生を知らせるシグナル
484 .B SIGIO
485
486 .B SIGURG
487 を受けるプロセスの
488 プロセス ID またはプロセスグループID を
489 .I arg
490 で指定された ID に設定する。
491 プロセスID は正の値として指定し、
492 プロセスグループID は負の値として指定する。
493 ほとんどの場合、呼び出し元プロセスは所有者として自分自身を指定する
494 (つまり
495 .I arg
496
497 .BR getpid (2)
498 を指定する)。
499
500 .\" glibc.info より:
501 .BR fcntl ()
502
503 .B F_SETFL
504 コマンドを使用してファイルディスクリプタに
505 .B O_ASYNC
506 状態フラグを設定した場合には、そのファイルディスクリプタへの
507 入出力が可能になる度に
508 .B SIGIO
509 シグナルが送られる。
510 .B F_SETSIG
511
512 .B SIGIO
513 以外の別のシグナルの配送を受けられるように
514 するのにも使うことができる。
515 許可 (permission) のチェックで失敗した場合には、
516 シグナルは黙って捨てられる。
517
518 .B F_SETOWN
519 により指定された所有者のプロセス (またはプロセスグループ) に
520 シグナルを送る際には、
521 .BR kill (2)
522 に書かれているのと同じ許可のチェックが行われる。
523 このとき、シグナルを送信するプロセスは
524 .B F_SETOWN
525 を使ったプロセスである
526 (但し、下記の「バグ」の章を参照のこと)。
527
528 ファイルディスクリプタがソケットを参照している場合は、
529 .B F_SETOWN
530 を使用して、ソケットに帯域外 (out-of-band) データが届いた時に
531 .B SIGURG
532 シグナルを配送する相手を選択することもできる
533 .RB ( SIGURG
534 が送られた場合には
535 .BR select (2)
536 がソケットが「特別な状態」にあると報告することだろう)。
537 .\" 以下の記述はゴミだろう。
538 .\" カーネルソースを見るとこの記述は間違っているようだし、
539 .\" プログラムを書いてみたところ、端末のフォアグランド・プロセスグループで
540 .\" なくても、端末が生成した SIGIO シグナルを受けとる。
541 .\" -- MTK, 8 Apr 05
542 .\"
543 .\" ファイルディスクリプタが端末デバイスを参照している場合には、
544 .\" SIGIO シグナルはその端末のフォアグランド・プロセスグループへと送られる。
545
546 バージョン 2.6.11 以前の 2.6.x カーネルでは、以下に示す動作であった。
547 .RS
548 .IP
549 スレッドグループをサポートしているスレッドライブラリ (例えば NPTL) を
550 使って動作しているマルチスレッド・プロセスで
551 .B F_SETSIG
552 に 0 以外の値を指定した場合、
553 .B F_SETOWN
554 に正の値を渡すと、その意味が違ってくる:
555 .\" The relevant place in the (2.6) kernel source is the
556 .\" 'switch' in fs/fcntl.c::send_sigio_to_task() -- MTK, Apr 2005
557 プロセス全体を示すプロセスID ではなく、プロセス内の特定の
558 スレッドを示すスレッドID と解釈される。
559 したがって、
560 .B F_SETSIG
561 を使う場合には、きちんと結果を受け取るには、
562 .B F_SETOWN
563 に渡す値を
564 .BR getpid (2)
565 ではなく
566 .BR gettid (2)
567 の返り値にする必要があるだろう。
568 (現状の Linux スレッド実装では、メイン・スレッドのスレッドID は
569 そのスレッドのプロセスID と同じである。つまり、
570 シグナル・スレッドのプログラムではこの場合
571 .BR gettid (2)
572
573 .BR getpid (2)
574 は全く同じように使うことができる。)
575 ただし、注意すべき点として、この段落で述べたことは、
576 ソケットの帯域外データが届いたときに生成される
577 .B SIGURG
578 シグナルにはあてはまらない。
579 このシグナルは常にプロセスかプロセスグループに送られ、
580 送信先は
581 .B F_SETOWN
582 に渡された値にしたがって決められる。
583 .\" send_sigurg()/send_sigurg_to_task() bypasses
584 .\" kill_fasync()/send_sigio()/send_sigio_to_task()
585 .\" to directly call send_group_sig_info()
586 .\"     -- MTK, Apr 2005 (kernel 2.6.11)
587 .RE
588 .IP
589 上記の動作は、Linux 2.6.12 で図らずも削除され、
590 元に戻されない予定である。
591 Linux 2.6.32 以降で、特定のスレッド宛にシグナル
592 .B SIGIO
593
594 .B SIGURG
595 を送るには
596 .B F_SETOWN_EX
597 を使うこと。
598 .TP
599 .BR F_GETOWN_EX " (struct f_owner_ex *) (Linux 2.6.32 以降)"
600 直前の
601 .B F_SETOWN_EX
602 操作で定義された現在のファイルディスクリプタの所有者設定
603 を返す。情報は
604 .I arg
605 が指す構造体に格納されて返される。構造体は以下の通りである。
606 .nf
607 .in +4n
608
609 struct f_owner_ex {
610     int   type;
611     pid_t pid;
612 };
613
614 .in
615 .fi
616 .I type
617 フィールドは、
618 .B F_OWNER_TID ,
619 .B F_OWNER_PID ,
620 .B F_OWNER_PGRP
621 のいずれか一つの値となる。
622 .I pid
623 フィールドは、スレッド ID、プロセス ID、プロセスグループ ID を
624 表す正の整数である。詳細は
625 .B F_SETOWN_EX
626 を参照。
627 .TP
628 .BR F_SETOWN_EX " (struct f_owner_ex *) (Linux 2.6.32 以降)"
629 この操作は
630 .B F_SETOWN
631 と同様の処理を行う。
632 この操作を使うと、I/O が利用可能になったことを示すシグナルを、
633 特定のスレッド、プロセス、プロセスグループに送ることができる
634 ようになる。
635 呼び出し元は、
636 .I arg
637 経由でシグナルの配送先を指定する。
638 .I arg
639
640 .I f_owner_ex
641 構造体へのポインタである。
642 .I type
643 フィールドは以下のいずれかの値を取り、
644 この値により
645 .I pid
646 がどのように解釈されるかが規定される。
647 .RS
648 .TP
649 .BR F_OWNER_TID
650 スレッド ID が
651 .I pid
652 で指定された値のスレッドにそのシグナルを送る
653 (スレッド ID は
654 .BR clone (2)
655
656 .BR gettid (2)
657 の呼び出しで返される値である)。
658 .TP
659 .BR F_OWNER_PID
660 ID が
661 .I pid
662 で指定された値のプロセスにそのシグナルを送る。
663 .TP
664 .BR F_OWNER_PGRP
665 ID が
666 .I pid
667 で指定された値のプロセスグループにそのシグナルを送る。
668 .RB ( F_SETOWN
669 と異なり、プロセスグループ ID には正の値を指定する点に注意すること。)
670 .RE
671 .TP
672 .BR F_GETSIG " (\fIvoid\fP)"
673 入力や出力が可能になった場合に送るシグナルを
674 (関数の結果として) 返す。
675 値ゼロは
676 .B SIGIO
677 を送ることを意味する。
678 .RB ( SIGIO
679 を含む) 他の値はいずれも、
680 .B SIGIO
681 の代わりに送るシグナル番号を表す。
682 後者の場合、シグナルハンドラを
683 .B SA_SIGINFO
684 フラグ付きで設定すれば、ハンドラで追加の情報を得ることができる。
685 .I arg
686 は無視される。
687 .TP
688 .BR F_SETSIG " (\fIlong\fP)"
689 入力や出力が可能になった場合に送るシグナルを
690 .I arg
691 に指定された値に設定する。
692 値ゼロは
693 .B SIGIO
694 を送ることを意味する。
695 .RB ( SIGIO
696 を含む) 他の値はいずれも、
697 .B SIGIO
698 の代わりに送るシグナル番号を表す。
699 後者の場合、シグナルハンドラを
700 .B SA_SIGINFO
701 フラグ付きで設定すれば、
702 ハンドラで追加の情報を得ることができる。
703 .\"
704 .\" The following was true only up until 2.6.11:
705 .\"
706 .\" また、
707 .\" .B F_SETSIG
708 .\" に 0 以外の値を渡すと、シグナルの受信者をプロセス全体から
709 .\" プロセス内の特定のスレッドに変更される。詳細は
710 .\" .B F_SETOWN
711 .\" の説明を参照のこと。
712
713 .B F_SETSIG
714 にゼロ以外の値を設定し、シグナルハンドラに
715 .B SA_SIGINFO
716 フラグを設定すると、
717 .RB ( sigaction (2)
718 を参照) I/O イベントに関する追加の情報が
719 .I siginfo_t
720 構造体でシグナルハンドラへ渡される。
721 .I si_code
722 フィールドが示すシグナルの原因が
723 .B SI_SIGIO
724 である場合、
725 .I si_fd
726 フィールドにはイベントに対応するファイルディスクリプタが入っている。
727 それ以外の場合は、どのファイルディスクリプタが利用可能かを示す情報は
728 ないので、どのファイルディスクリプタで I/O が可能かを判断するためには
729 通常の機構
730 .RB ( select (2),
731 .BR poll (2),
732 .B O_NONBLOCK
733 を設定した
734 .BR read (2)
735 など) を使用しなければならない。
736
737 リアルタイムシグナル (値が
738 .B SIGRTMIN
739 以上) を選択している場合は、
740 同じシグナル番号を持つ複数の I/O イベントがキューに入ることがある
741 (キューに入れるかどうかは利用可能なメモリに依存している)。
742 上記と同様、 
743 .B SA_SIGINFO
744 が設定されている場合、シグナルハンドラのための追加の情報が得られる。
745
746 .\" See fs/fcntl.c::send_sigio_to_task() (2.4/2.6) sources -- MTK, Apr 05
747 以下の点に注意すること。
748 Linux では一つのプロセスに対してキューに入れられるリアルタイム
749 シグナルの数に上限が設けられており
750 .RB ( getrlimit (2)
751
752 .BR signal (7)
753 を参照)、この上限に達するとカーネルは
754 .B SIGIO
755 シグナルを配送する。この
756 .B SIGIO
757 シグナルは、指定されたスレッドではなくプロセス全体に送られる。
758 .PP
759 これらの機構を使用することで、ほとんどの場合で
760 .BR select (2)
761
762 .BR poll (2)
763 を使用せずに完全な非同期 I/O を実装することができる。
764 .PP
765 .BR O_ASYNC ,
766 .BR F_GETOWN ,
767 .B F_SETOWN
768 の使用は BSD と Linux に特有である。
769 .BR F_GETOWN_EX ,
770 .BR F_SETOWN_EX ,
771 .BR F_GETSIG ,
772 .B F_SETSIG
773 は Linux 固有である。POSIX には、同様のことを行うために、非同期 I/O と
774 .I aio_sigevent
775 構造体がある。Linux では、GNU C ライブラリ (Glibc) の一部として
776 これらも利用可能である。
777 .SS "リース (leases)"
778 (Linix 2.4 以降で利用可能)
779 .B F_SETLEASE
780 は、
781 .I fd
782 が参照するオープンファイル記述に対して新しいリースを設定するのに使用される。
783 .B F_GETLEASE
784 は、
785 .I fd
786 が参照するオープンファイル記述に対して設定されている
787 現在のリースを取得するのに使用される。
788 ファイルのリースにより、
789 あるプロセス ("lease breaker") がそのファイルディスクリプタが参照
790 しているファイルに対して
791 .BR open (2)
792
793 .BR truncate (2)
794 を行おうとした際に、リースを保持しているプロセス ("lease holder") へ
795 (シグナルの配送による) 通知が行われるという機構が提供される。
796 .TP
797 .BR F_SETLEASE " (\fIlong\fP)"
798 .I arg
799 の内容に基いてファイルのリースの設定、削除を行う。整数
800 .I arg
801 には以下の値が指定できる:
802
803 .RS
804 .TP
805 .B F_RDLCK
806 読み出しリースを取得する。これにより、
807 そのファイルが書き込み用にオープンされたり、ファイルが切り詰められた場合に、
808 呼び出し元のプロセスに通知が行われるようになる。
809 .\" 以下の内容はカーネル 2.6.10 で実装された。
810 .\" より詳しい情報は man-pages-2.09 の Changelog を参照。
811 読み出しリースを設定できるのは、読み出し専用でオープンされている
812 ファイルディスクリプタに対してのみである。
813 .TP
814 .B F_WRLCK
815 書き込みリースを取得する。これにより、
816 (読み出し用か書き込み用にかかわらず) そのファイルがオープンされたり、
817 ファイルが切り詰められた場合に、呼び出し元のプロセスに通知が行われるようになる。
818 書き込みリースは、そのファイルに対するオープンされたファイルディスクリプタが
819 他にない場合にのみ設定できる。
820 .TP
821 .B F_UNLCK
822 そのファイルからリースを削除する。
823 .RE
824 .P
825 リースはオープンファイル記述に対して関連付けられる
826 .RB ( open (2)
827 参照)。
828 つまり、
829 .RB ( fork (2)
830
831 .BR dup (2)
832 などにより作成された) ファイルディスクリプタの複製は同じリースを参照し、
833 複製も含めたどのファイルディスクリプタを使ってもこのリースを変更したり
834 解放したりできる。
835 また、これらのファイルディスクリプタのいずれかに対して
836 .B F_UNLCK
837 操作が明示的に実行された場合や、すべてのファイルディスクリプタが
838 閉じられた場合にも、リースは解放される。
839 .P
840 リースの取得は通常のファイル (regular file) に対してのみ可能である。
841 非特権プロセスがリースを取得できるのは、UID (所有者) がプロセスの
842 ファイルシステム UID と一致するファイルに対してだけである。
843 .B CAP_LEASE
844 ケーパビリティを持つプロセスは任意のファイルに対してリースを取得できる。
845 .TP
846 .BR F_GETLEASE " (\fIvoid\fP)"
847 ファイルディスクリプタ
848 .I fd
849 に対して設定されているリースの種別を取得する。
850 .BR F_RDLCK ", " F_WRLCK ", " F_UNLCK
851 のいずれかが返される。
852 .BR F_RDLCK ", " F_WRLCK
853 はそれぞれ、読み出しリース、書き込みリースが設定されていることを示し、
854 .B F_UNLCK
855 はリースが何も設定されていないことを示す。
856 .I arg
857 は無視される。
858 .PP
859 あるプロセス ("lease folder") が
860 .B F_SETLEASE
861 で設定されたリースと矛盾するような
862 .BR open (2)
863
864 .BR truncate (2)
865 を実行した場合、
866 そのシステムコールはカーネルによって停止され、
867 カーネルは lease holder にシグナル (デフォルトでは
868 .BR SIGIO )
869 を送って通知を行う。
870 lease holder はこのシグナルを受信したときにはきちんと対応すべきである。
871 具体的には、別のプロセスがそのファイルにアクセスするための準備として
872 必要な後片付け (例えば、キャッシュされたバッファのフラッシュ) を
873 すべて行ってから、そのファイルのリースの削除または格下げを行う。
874 リースを削除をするには、
875 .I arg
876
877 .B F_UNLCK
878 を指定して
879 .B F_SETLEASE
880 を実行する。
881 lease holder がファイルに書き込みリースを保持していて、
882 lease breaker が読み出し用にそのファイルをオープンしている場合、
883 lease holder が保持しているリースを読み出しリースに格下げすれば
884 十分である。これをするには、
885 .I arg
886
887 .B F_RDLCK
888 を指定して
889 .B F_SETLEASE
890 を実行する。
891
892 lease holder が
893 .I /proc/sys/fs/lease-break-time
894 で指定された秒数以内にリースの格下げか削除を行えなかった場合、
895 カーネルは強制的にその lease holder のリースを削除もしくは格下げを行う。
896
897 一度リースの削除か格下げが自発的もしくは強制的に行われると、
898 lease breaker がまだシステムコールを再開していない場合には、
899 カーネルが lease breaker のシステムコールの続行を許可する。
900
901 lease breaker が実行した
902 .BR open (2)
903
904 .BR truncate (2)
905 が停止中にシグナルハンドラにより中断された場合、
906 そのシステムコールは
907 .B EINTR
908 エラーで失敗するが、上で述べた他の処理は
909 そのまま行われる。
910 .BR open (2)
911
912 .BR truncate (2)
913 が停止中に lease breaker がシグナルにより kill された場合、
914 上で述べた他の処理はそのまま行われる。
915 lease breaker が
916 .BR open (2)
917 を呼ぶ際に
918 .B O_NONBLOCK
919 フラグを指定した場合、そのシステムコールは
920 .B EWOULDBLOCK
921 エラーで直ちに失敗するが、上で述べた他の処理はそのまま行われる。
922
923 lease holder への通知に使われるデフォルトのシグナルは
924 .B SIGIO
925 だが、
926 .BR fcntl ()
927
928 .B F_SETSIG
929 コマンドで変更することができる。
930 .B F_SETSIG
931 コマンドが実行され
932 .RB ( SIGIO
933 を指定された場合も含む)、
934 .B SA_SIGINFO
935 フラグ付きでシグナルハンドラが設定されている場合には、
936 ハンドラの第二引き数として
937 .I siginfo_t
938 構造体が渡され、この引き数の
939 .I si_fd
940 フィールドには別のプロセスがアクセスしたリース設定済みファイルの
941 ディスクリプタが入っている
942 (この機能は複数のファイルに対してリースを設定する場合に有用である)。
943 .SS "ファイルやディレクトリの変更の通知 (dnotify)"
944 .TP
945 .BR F_NOTIFY " (\fIlong\fP)"
946 (Linux 2.4 以降)
947 .I fd
948 で参照されるディレクトリか、その中にあるファイルに変更があった場合に
949 通知を行う。どのイベントを通知するかは
950 .I arg
951 で指定する。
952 .I arg
953 はビットマスクで、以下のビットの 0個以上の論理和をとったものを指定する。
954 .RS
955 .sp
956 .PD 0
957 .TP 12
958 .B DN_ACCESS
959 ファイルへのアクセスがあった (read, pread, readv)
960 .TP
961 .B DN_MODIFY
962 ファイルの内容が変更された (write, pwrite, writev, truncate, ftruncate).
963 .TP
964 .B DN_CREATE
965 ファイルが作成された (open, creat, mknod, mkdir, link, symlink, rename).
966 .TP
967 .B DN_DELETE
968 ファイルが削除 (unlink) された (unlink, 別のディレクトリへの rename, rmdir)
969 .TP
970 .B DN_RENAME
971 ディレクトリ内でのファイル名の変更があった (rename)
972 .TP
973 .B DN_ATTRIB
974 ファイル属性が変更された (chown, chmod, utime[s])
975 .PD
976 .RE
977 .IP
978 (上記の定義を利用するには
979 .B _GNU_SOURCE
980 機能検査マクロを定義しなければならない。)
981
982 ディレクトリの変更通知は通常「一回限り (one-shot)」であり、
983 アプリケーション側でその後さらに通知を受信したい場合は
984 再登録しなければならない。
985 .I arg
986
987 .B DN_MULTISHOT
988 が含まれていた場合には、
989 変更通知は明示的に解除されるまで有効状態が継続する。
990
991 .\" 以下は API の設計がまずいと思うのだが...
992 .B F_NOTIFY
993 要求は積算されていく。つまり、
994 .I arg
995 で指定されたイベントがすでにモニタされている
996 イベント集合に加算される形になる。
997 すべてのイベントの通知を無効にするには、
998 .I arg
999 に 0 を指定して
1000 .B F_NOTIFY
1001 を呼び出す必要がある。
1002
1003 通知はシグナルの配送で行われる。
1004 デフォルトのシグナルは
1005 .B SIGIO
1006 だが、
1007 .BR fcntl ()
1008
1009 .B F_SETSIG
1010 コマンドで変更することができる。
1011 後者の場合には、
1012 .RB ( SA_SIGINFO
1013 フラグ付きでシグナルハンドラが設定されている場合には)
1014 ハンドラの第二引き数として
1015 .I siginfo_t
1016 構造体が渡され、この構造体の
1017 .I si_fd
1018 フィールドには通知の行われたファイルディスクリプタが入っている
1019 (この機能は複数のディレクトリに対して通知を設定する場合に有用である)。
1020
1021 特に
1022 .B DN_MULTISHOT
1023 を使う場合は、通知にはリアルタイムシグナルを使うべきである。
1024 それは、リアルタイムシグナルを使うことで、複数の通知をキューに入れる
1025 ことができるからである。
1026
1027 .B 注意:
1028 新しくアプリケーションを書く際には、(カーネル 2.6.13 以降で利用可能となった)
1029 .I inotify
1030 インタフェースを使用すべきである。
1031 .I inotify
1032 はファイルシステムイベントの通知を取得するための
1033 ずっと優れたインタフェースである。
1034 .BR inotify (7)
1035 を参照。
1036 .SH 返り値
1037 成功した場合の返り値は操作の種類により違う:
1038 .TP 0.9i
1039 .B F_DUPFD
1040 新しいディスクリプタを返す。
1041 .TP
1042 .B F_GETFD
1043 ファイルディスクリプタ・フラグの値を返す。
1044 .TP
1045 .B F_GETFL
1046 ファイル状態フラグの値を返す。
1047 .TP
1048 .B F_GETLEASE
1049 ファイルディスクリプタに対して保持されているリースの種別を返す。
1050 .TP
1051 .B F_GETOWN
1052 ディスクリプタの所有者を返す。
1053 .TP
1054 .B F_GETSIG
1055 読み込みや書き出しが可能になった時に送られるシグナルの値、もしくは
1056 伝統的な
1057 .B SIGIO
1058 動作の場合にはゼロを返す。
1059 .TP
1060 他の全てのコマンドは 0 を返す。
1061 .PP
1062 エラーの時は \-1 が返され、
1063 .I errno
1064 に適切な値が設定される。
1065 .SH エラー
1066 .TP
1067 .BR EACCES " か " EAGAIN
1068 他のプロセスが保持しているロックによって操作が禁止されている。
1069 .TP
1070 .B EAGAIN
1071 そのファイルは他のプロセスによってメモリ・マップされているため、
1072 操作が禁止されている。
1073 .TP
1074 .B EBADF
1075 .I fd
1076 がオープンされたファイルディスクリプタでない。
1077 あるいはコマンドが
1078 .B F_SETLK
1079 または
1080 .B F_SETLKW
1081 だったが、対象のファイルディスクリプタのオープンモードが
1082 必要となるロックの型にマッチしていない。
1083 .TP
1084 .B EDEADLK
1085 指定された
1086 .B F_SETLKW
1087 コマンドを実行した場合にはデッドロックになることが検出された。
1088 .TP
1089 .B EFAULT
1090 .I lock
1091 が利用可能なアドレス空間の外部にある。
1092 .TP
1093 .B EINTR
1094 .B F_SETLKW
1095 コマンドがシグナルにより割り込まれた
1096 .RB ( signal (7)
1097 参照)。
1098 .BR F_GETLK " と " F_SETLK
1099 の場合、ロックを確認したり取得したりする前にシグナルによって割り込まれた。
1100 これはたいていリモートのファイルをロックする場合
1101 (例えば NFS 上でロックする場合) に起こる。
1102 しかしローカルでも起こる場合がある。
1103 .TP
1104 .B EINVAL
1105 .BR F_DUPFD で、
1106 .I arg
1107 が負か、もしくは許される最大値よりも大きい。
1108 .B F_SETSIG
1109 の場合、
1110 .I arg
1111 が利用可能なシグナル番号ではない。
1112 .TP
1113 .B EMFILE
1114 .BR F_DUPFD で、
1115 プロセスがすでに最大数までファイルディスクリプタをオープンしている。
1116 .TP
1117 .B ENOLCK
1118 オープンされているロックの数が多過ぎて、ロック・テーブルがいっぱいである。
1119 または remote locking protocol (例えば NFS 上のロック) が失敗した。
1120 .TP
1121 .B EPERM
1122 追加専用属性が設定されたファイルの
1123 .B O_APPEND
1124 フラグをクリアしようと試みた。
1125 .SH 準拠
1126 SVr4, 4.3BSD, POSIX.1-2001.
1127 POSIX.1-2001 で規定されている操作は、
1128 .BR F_DUPFD ,
1129 .BR F_GETFD ,
1130 .BR F_SETFD ,
1131 .BR F_GETFL ,
1132 .BR F_SETFL ,
1133 .BR F_GETLK ,
1134 .BR F_SETLK ,
1135 .BR F_SETLKW ,
1136 .BR F_GETOWN ,
1137 .B F_SETOWN
1138 だけである。
1139
1140 .B F_DUPFD_CLOEXEC
1141 は POSIX.1-2008 で規定されている。
1142
1143 .BR F_GETOWN_EX ,
1144 .BR F_SETOWN_EX ,
1145 .BR F_GETSIG ,
1146 .BR F_SETSIG ,
1147 .BR F_NOTIFY ,
1148 .BR F_GETLEASE ,
1149 .B F_SETLEASE
1150 は Linux 固有である (これらの定義を有効にするには
1151 .B _GNU_SOURCE
1152 マクロを定義すること)。
1153 .\" .PP
1154 .\" SVr4 には他に EFAULT, EINTR, EIO, ENOLINK, EOVERFLOW エラー状態についての
1155 .\" 記述がある。
1156 .SH 注意
1157 エラーの際の返り値が
1158 .BR dup2 (2)
1159
1160 .B F_DUPFD
1161 では異なっている。
1162
1163 カーネル 2.0 以降では、
1164 .BR flock (2)
1165
1166 .BR fcntl ()
1167 が設定するロック種別の間に相互作用はない。
1168
1169 システムによっては、
1170 .I "struct flock"
1171 に上記以外のフィールドがあるものもある (例えば
1172 .IR l_sysid )。
1173 .\" e.g., Solaris 8 documents this field in fcntl(2), and Irix 6.5
1174 .\" documents it in fcntl(5).  mtk, May 2007
1175 はっきりと言えることは、ロックを保持しているプロセスが別のマシンに存在
1176 する場合には、
1177 .I l_pid
1178 だけはあまり役にたたないだろうということである。
1179 .SH バグ
1180 いくつかのアーキテクチャ (特に i386) における Linux システムコールの慣習
1181 のため以下の制限が存在する。
1182 .B F_GETOWN
1183 が返す (負の) プロセスグループID が \-1 から \-4095 の範囲に入った場合、
1184 glibc はこの返り値をシステムコールでエラーが起こったと
1185 間違って解釈してしまう。つまり、
1186 .BR fcntl ()
1187 の返り値は \-1 となり、
1188 .I errno
1189 には (正の) プロセスグループID が設定されることになる。
1190 Linux 固有の
1191 .B F_SETOWN_EX
1192
1193 .B F_GETOWN_EX
1194 ではこの問題を回避できる。
1195 .\" mtk, Dec 04: alpha と ia64 では、少しテストしてみた限り、
1196 .\" 「どんな」負の PGID でも F_GETOWN でエラーが起こったと間違って
1197 .\" 解釈されてしまうようだ。他のいくつかのアーキテクチャでは、
1198 .\" i386 と同様の範囲のチェックが行われているようだ。
1199
1200 Linux 2.4 以前では、非特権プロセスが
1201 .B F_SETOWN
1202 を使って、ソケットのファイルディスクリプタの所有者に
1203 呼び出し元以外のプロセス (やプロセスグループ) を指定すると
1204 発生するバグがある。この場合、
1205 呼び出し元が所有者として指定したプロセス (やプロセスグループ) に
1206 シグナルを送る許可を持っていたとしても、
1207 .BR fcntl ()
1208 が \-1 を返し
1209 .I errno
1210
1211 .B EPERM
1212 を設定することがある。
1213 このエラーが返ったにもかかわらず、ファイルディスクリプタの所有者
1214 は設定され、シグナルはその所有者に送られる。
1215
1216 これまでの Linux の全てのバージョンにおける強制ロックの実装は、
1217 競合条件下で強制ロックが不完全になるような場合がある。
1218 .\" http://marc.info/?l=linux-kernel&m=119013491707153&w=2
1219 ロックと重なって実行された
1220 .BR write (2)
1221 の呼び出しは強制ロックが獲得された後にもデータを変更することができる。
1222 ロックと重なって実行された
1223 .BR read (2)
1224 の呼び出しは強制ロックが獲得された後になって行われたデータの変更を
1225 検出することができる。
1226 同様の競合条件が強制ロックと
1227 .BR mmap (2)
1228 の間にも存在する。それゆえ、強制ロックに頼るのはお薦めできない。
1229 .SH 関連項目
1230 .BR dup2 (2),
1231 .BR flock (2),
1232 .BR open (2),
1233 .BR socket (2),
1234 .BR lockf (3),
1235 .BR capabilities (7),
1236 .BR feature_test_macros (7)
1237 .P
1238 カーネルソースの
1239 .IR Documentation/filesystems/
1240 ディレクトリ内の
1241 .IR locks.txt ,
1242 .IR mandatory-locking.txt ,
1243 .I dnotify.txt
1244 も参照のこと。
1245 (以前のカーネルでは、これらのファイルは
1246 .I Documentation/
1247 ディレクトリ直下にあり、
1248 .I mandatory-locking.txt
1249
1250 .I mandatory.txt
1251 という名前であった。)