From: nobu.nakada@... Date: 2002-07-31T16:42:37+09:00 Subject: [ruby-dev:17855] non-blocking IO --Multipart_Wed_Jul_31_16:42:36_2002-1 Content-Type: text/plain; charset=ISO-2022-JP なかだです。 File::NONBLOCKを指定したIOでEWOULDBLOCKが発生すると、途中まで読 まれたデータがあっても失われてしまいます。 $ cat io/nonblock.rb require "fcntl" class IO def nonblock(nb) (fcntl(Fcntl::F_GETFL) & File::NONBLOCK) != 0 end def nonblock=(nb) f = fcntl(Fcntl::F_GETFL) if nb f |= File::NONBLOCK else f &= ~File::NONBLOCK end fcntl(Fcntl::F_SETFL, f) end end $ cat nbtest.rb require 'io/nonblock' open("|-", "r+") do |f| unless f STDOUT.sync = true begin STDOUT.print "foo" sleep 3 STDOUT.print "bar\n" rescue Errno::EPIPE end exit else f.nonblock = true sleep 1 p f.gets rescue p $! # "foo"が読まれているが捨てられる f.nonblock = false p f.eof? p f.gets #=> "bar\n" end end 添付のパッチのようにリトライする以外にも、Errno::EWOULDBLOCKに 読めたデータを持たせるという方法も考えられますが。 --Multipart_Wed_Jul_31_16:42:36_2002-1 Content-Type: text/x-diff; type=gzip; charset=US-ASCII Content-Disposition: attachment; filename="nonblock.diff.gz" Content-Transfer-Encoding: base64 H4sIAAAAAAACA+1VXW/aSBR9tn/FrSJFJrYLNh+lIKqmCYnYpVCRZKvdF8vY42DVsdHYhI1S /vveO2OwCSZqtd239QPGM3funHvOuTOj2Gd/9yBM3nrq4N8/6uziBoIwYj2oe49pna/mT/WU e/IP7WI8qpxlPGSPYXwPHF9pmMRgvbVatuqHQQDmCkwbzCWYXIxKcKZpij+K3YXfVjHYjYYN Vrdnd3qNBpgNfBSZRNd1Gdm0MDKSkY1Wz272mk0ZqX78iHu03xst0OlldwBHwsQJgmiVLrTA gGCZ8ZoKGxVU/TEJfVXncwcj1m6YOZy5vjuPmBYsa6oO+FyNxkM4C5Z9VX+WI4HvpCwDHvhp X46EcQYBDAQ/cUJrcSJffun8NZxNtVMKr/V3gzfDWwKzN4w4sgUhwPwR8zItAB2sPMiAyd14 XP6lZRva56CKNQ8zWUWtBPCggnVRwQ7muhrm+gdgSmQitAom1M+AgJE7glXsZeiOFM7qKqSZ m4Ue/HE+vhtKATsdo40CdrvGVj9aybQwMTCa5KNnumTxFVJO8mS8LwdzvfqqSV9RgrvFOXD5 YQDfFsLuwzRjHLyFy+FM5pBZsMaUeSvOtBbiF5i6tmFboDcbbQOdehwVGeGaZV9pitBpwnCU WWyKHxgwu7mdjSbXGi0zP4idxWx8MIeOyuf8BJ5VOAkDnwXgOIvVgxt3ut8cR5b6rJrKYUXV e5nKkY1MZb0gRjXTjOHDABo1HBIOCgALWWWeRll1HfuoBoMBDKdXFKLM0RDftolpX7NyX0q1 kS/KGMObChhwegoB4zzhaGDKTmo8pU7ghpFgE7O52YKMpbyGCynRC/C7hPBKOorOS9EVdK2C PKB0JyxKmYRN9QVS94MCDWqDg3IIUv/nahbIebHTNneeS5bNqc4Yvn+HN6WVW/S5T4Zfp3fj y0/j6cXv+TIMjRNBUTFVUFV5iuTHWm1HEQmsD0QjKZIUs/TlJTF2+YrlHJ6wGI9/FY7LmNsC 8kjh9g3kTkQfog1L/XHUXVAYlZI/JD6DU7j6PL0cOjd/Ti6oSlAOLwPZ4G1scAuvjY6F7921 QeecpD9XEjNUWIoSK+k6zLxFznBNNCTGem7KYDia3M56cqBMEBQR59fno0lPNDigcmHMfG1P InRI6ZtcJNeUkxTzvYJO5aWyxS0nFH0BMo/3IuZyLKUI2gO+O4c+TWfj88nlBZ5DJSBfRl+G WO9OewmBZSseE5MoIB1rxfSGfvL5hhTkXbtJt8C7bpt0wRF3iQe+HyEzQmEDaYrCB3H2LkkX 0sQrNf8RpVCE/T6gsmt7rj2UUj8QSv95ofRqofT/Uih9y+2x5pMsbQTlVqPTJs4t/JOTLtEw 11s48ydx2f1P9a+h+n1HUt3ap/qe4WUmWN5Suk90BcnbwJc83ydZQk3Hn7ZHcwXZYptfwHc5 zxHKj9NdXrxj/CXbh+VsckpfYXyj/gMTk3RvCg0AAA== --Multipart_Wed_Jul_31_16:42:36_2002-1 Content-Type: text/plain; charset=ISO-2022-JP -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦 --Multipart_Wed_Jul_31_16:42:36_2002-1--