Path: sranha!katsu From: katsu@sra.co.jp (WATANABE Katsuhiro) Message-ID: Date: 22 Jan 91 13:08:02 Organization: Software Research Associates, Inc.,Japan In-reply-to: taisuke@kw.phys.keio.ac.jp's message of 18 Jan 91 11:05:15 GMT Newsgroups: fj.questions.unix Subject: UNIX read/write Distribution: fj References: 記事 で taisuke@kw.phys.keio.ac.jp (Taisuke Boku) さんいはく > In article > katsu@sra.co.jp (WATANABE Katsuhiro) writes: > | 通常モード(blocking write)の場合でも、シグナルを捕捉し、 > |かつ呼び出されたユーザー定義ハンドラから return する場合には、 > |途中で write システムコールが終了する事態が発生することがあります。 > > 4.2bsd 以降はシグナルによってシステム・コールが中断された場合は自動的に > 再実行がされるんではなかったでしたっけ? また、自動的に再実行するかどう > かは siginterrupt (3) で変更できるはずです。 siginterrupt(3) は、システムコールレベルで話をすれば sigvec(2) での sv_flags の SV_INTERRUPT のことですね。 さて、シグナルによって中断されたシステムコールを自動的に再実行する ためにはいくつか条件が必要で、条件が満たされない場合、よしんば SV_INTERRUPT がリセットされていても再実行はされません。(NEWS OS 4.0R や VAX 4.3BSD や SunOS 4.1 では再実行されないようです。) どういう条件かというと、NEWS OS 4.0R の man 3 siginterrupt によれば man> flag が偽(値 0)ならば、指定シグナルで割り込まれ、かつまだデータが ^^^^^^^^^^^^^^^^ man> 転送されていない場合、システムコールは再スタートされます。 ^^^^^^^^^^^^^^^^^^^^ とあります。 これに関連して、「The Design and Implementation of the 4.3BSD Unix Operating System」(*) の 3.2章「System Calls」でも、 システムコールの再実行が CPU の状態(Program Counter 等)を システムコール実行直前に復帰させることで実現されている(場合がある) ことに触れた上で、 D&I> Restarting a system call by backing up the program counter has D&I> certain implications. Most important is that the kernel must ensure D&I> that it does not modify any of the input parameters. Second, it must D&I> ensure that the system call has not partially completed. For example, D&I> if a partial line has been read from the terminal, the read must D&I> return with a short count. If the call were restarted, the partially D&I> read line would be inappropriately overwritten. のように read のような(転送の量とか程度とかが関わりあう) システムコールは、途中で割り込まれたような場合は必ずしも 再実行できないと述べています。(当然 write も同様。) 結局 write(2) に関していうと、SV_INTERRUPT をリセットした時の効果は、 システムコールが EINTR という原因で -1 を返す事態(好運にも write の 実際の動作が始まる前にシグナルが捕捉されたために再実行が可能だったで あろう場合に相当)を起こさなくするだけのことで、write や read の途中で シグナルを捕捉してしまった時に、データの残りの部分について再度実行を試みて くれるような効果まではないと思います。(実装によるのかもしれませんが、 NEWS-OS 4.0R や VAX 4.3BSD や SUNOS 4.1 では再実行してくれないようです。) (*)著者: Samuel J. Leffler, Marchall Kirk McKusick, Michael J. Karels, John S. Quarterman; 出版社 Addison-Wesley; ISBN 0-201-06196-1 -- ----____----____ 渡邊克宏 SRAソフトウェア工学研究所