Path: sranha!katsu From: katsu@sra.co.jp (WATANABE Katsuhiro) Message-ID: Date: 14 Jan 91 13:27:55 Organization: Software Research Associates, Inc.,Japan In-reply-to: akio@pfu.fujitsu.co.JP's message of 11 Jan 91 04:34:50 GMT Newsgroups: fj.questions.unix Subject: Re: Question when a socket receives BIG size data . Distribution: fj References: 記事 で akio@pfu.fujitsu.co.JP (Akio-Shibata) さんいはく > Non-blockingモードの場合には、 > > >write のマニュアルにも「実際に書くことができたバイト数を返す」とありま > >す。 > > こうなりますが、通常モードの場合には、全部送られるかエラーが発生するまで > 復帰しません。 これは、シグナルを含めて考えると正しくないと思います。 通常モード(blocking write)の場合でも、シグナルを捕捉し、 かつ呼び出されたユーザー定義ハンドラから return する場合には、 途中で write システムコールが終了する事態が発生することがあります。 逆に、シグナルを捕捉しない場合には常に全部送られると私は考えているのですが、 この問題に関して近藤@富士通研さんは > Message-ID: > write のマニュアルにも「実際に書くことができたバイト数を返す」とありま > す。 とおっしゃっていますし、去年11月ごろには fj.unix の 記事 <6223@icsts1.osaka-u.ac.jp> で阪大の齊藤明紀さんいはく > ソケットに対する write は、注意が必要です。 > > n=write(fd, ptr, length); > > ディスクファイルなどでは、 n==length or -1 だと思ってよいので > すが、fd がソケットだと 10KB 書こうとして 8KB しか書けないと > かいう事態が起こります。 という記事もありました。 そこでお伺いしたいのですが、STREAM への write が中途半端に終ってしまう (つまり write の返り値に一層の注意を払わなければならない)のは、 シグナルを捕捉する(かつハンドラーからreturn する)場合以外には どのような場合があるのでしょうか?シグナルを捕捉しなければ write は常に 全部送られると考えてしまうのは間違いでしょうか? ところで、BSD ってシステムコールの途中で(割り込み可能な優先度で) プロセスが休眠しているような状態でシグナルを受けとると、プロセス コンテキストをシステムコール発生直前に戻して再度同じシステムコールを 試すような実装がなされていますよね? だから、どうせだったらシグナル捕捉などが原因で途中で write が終った場合も 残りの部分について再試行するようにしてくれたってよかったと思うのは 私だけでしょうか?話の発端になった read にしても、指定した分のデータが 準備されるまでカーネル内でブロックしていたってかまわなかったと思うのですが、 いかがでしょう? -- ----____----____ 渡邊克宏 SRAソフトウェア工学研究所