ruby/perl のsyswrite について話したあとばたんと寝てたら、寝てる間に ruby コミッタと linux kernel コミッタがやってきて write(2) の制約であることが明らかになっていた

ruby/perl のsyswrite について話したあとばたんと寝てたら、寝てる間に ruby コミッタと linux kernel コミッタがやってきて write(2) の制約であることが明らかになっていた
28
mackerel-plugin-kazeburo @kazeburo

blocking(1)だとsyswrite($fh,$buf)は全部書き出してくれるのか

2013-03-15 00:32:32
mackerel-plugin-kazeburo @kazeburo

こういうのってなんの本を読んだら書いてあるんだろぅ

2013-03-15 00:33:45
mackerel-plugin-kazeburo @kazeburo

[socket] / “非ブロッキングI/O - s-kitaの日記” http://t.co/QyzWczlhV8

2013-03-15 00:36:18
tagomoris @tagomoris

@kazeburo perl の syswrite() が write(2) 相当だっていう話ですか?

2013-03-15 00:37:23
mackerel-plugin-kazeburo @kazeburo

@tagomoris perlだけじゃなくてunixのsocketですねー

2013-03-15 00:38:17
tagomoris @tagomoris

@kazeburo そういう話、詳解UNIXプログラミングでだいたい覚えた気がしますね。あれはいつも手元にほしい……。

2013-03-15 00:39:40
tagomoris @tagomoris

UNIXネットワークプログラミングとかもたまに手元に欲しい

2013-03-15 00:46:55
Sadayuki Furuhashi @frsyuki

@tagomoris @kazeburo UNIXのwrite(2)なら、blockingでも全部書いてくれる保証はないはずです。ただ少なくとも1バイト書くまではブロックしてくれる。PIPE_BUFサイズまではアトミックに書けるという話もたしか。

2013-03-15 01:09:11
tagomoris @tagomoris

@frsyuki @kazeburo いや指定長書ける空きがバッファになかったらblockしますよ

2013-03-15 01:10:30
Sadayuki Furuhashi @frsyuki

@tagomoris @kazeburo 詳解UNIXは分厚すぎて手元にあっても開くのが億劫になるレベルなので、manが良いですね。基本的な事項なら日本語のでも。

2013-03-15 01:10:50
tagomoris @tagomoris

@tagomoris @frsyuki @kazeburo あああ、なんかたぶん pipe とそれ以外でも違うかな……。自信なくなってきた

2013-03-15 01:12:23
Sadayuki Furuhashi @frsyuki

@tagomoris @kazeburo 書き出し先がファイルでLinuxの場合? 例えばソケットやpipeに2GB書こうとしたケースで、そもそもソケットやpipeのバッファは2GBもないので1発では書けないはず。

2013-03-15 01:14:29
tagomoris @tagomoris

man 2 write によると、書き込み先が物理メディアで物理的に空きが無い場合(もしくはlimitかかっている場合)、および割り込みがあった場合には count 以下のバイト数になることがある、とある

2013-03-15 01:15:24
tagomoris @tagomoris

@frsyuki @kazeburo そのときはバッファのflush(相手への転送)と空いたバッファの充填を繰り返して全データはけるまで繰り返すはず。nonblockの場合は1発でできなければ1発分だけやって戻る。

2013-03-15 01:16:38
Sadayuki Furuhashi @frsyuki

@tagomoris 少なくとも insufficient space on the underlying physical medium, RLIMIT_FSIZE, was interrupted by a signal handler

2013-03-15 01:29:10
Sadayuki Furuhashi @frsyuki

@tagomoris @kazeburo "少なくとも1バイト"というわけではないっぽいですね…orz カーネル空間でもループしてくれる。でも容量不足とかのエラーが発生したり、シグナルとかで割り込まれるとそこで中断して、エラーは返さずにそこまでのバイト数を返す。

2013-03-15 01:33:22
Sadayuki Furuhashi @frsyuki

@tagomoris rubyのsyswriteですが、2GBは書いてくれないですねぇ。https://t.co/QFQR7GkcXL

2013-03-15 01:38:57
tagomoris @tagomoris

@frsyuki おやまあ、ほんとだ。なんでだろ…… size_t を signed int32 固定で扱ってるからっぽいな

2013-03-15 01:40:09
Sadayuki Furuhashi @frsyuki

@tagomoris @kazeburo SSIZE_MAX を超えたら、実装依存で書き込み途中で帰っても良いらしいです。SSIZE_MAX は ((unsigned)-1 >> 1)。 http://t.co/6MJSBrhv36

2013-03-15 01:40:44
残りを読む(71)

コメント

hiroyukim @hiroyukim 2013年3月15日
参加者の発言を観測した限りは拾えたはずです。ご指摘ありがとうございました。
0
KOSAKI Motohiro @kosaki55tea 2013年3月15日
結局わたしはツイートを消していいのかいけないのか(困惑)
0
hiroyukim @hiroyukim 2013年3月15日
@kosaki55tea 空気読まずにまとめてしまってすみません。消さずにすむならありがたいのです。
0
Tsuyoshi CHO @tsuyoshi_cho 2013年3月17日
みなさまご苦労さまです...。
0