[#28402] crypt — Kenji Noda <zaq94465a@...>
野田です
In message "[ruby-list:28402] crypt"
At Fri, 2 Mar 2001 04:34:52 +0900,
newです.
まつもと ゆきひろです
坂下です。
In message <200103030343.MAA03741@smtp1.dti.ne.jp>
坂下です。
新井です。
ごとけんです
newです.
新井です。
新井です。
In message <200103020836.RAA07709@hanare00.math.sci.hokudai.ac.jp>
At Fri, 2 Mar 2001 18:59:39 +0900,
[#28415] class Real — 正木 功 <GEC01122@...>
正木です。
[#28429] Marshal format version — Takahiro Kambe <taca@...>
再び、こんばんは。
石橋秀仁です。こんにちは。
まつもと ゆきひろです
In message <983957685.946561.24647.nullmailer@ev.netlab.zetabits.com>
[#28435] ruby 1.6.3? — akira yamada / やまだあきら <akira@...>
まつもと ゆきひろです
まつもと ゆきひろです
まつもと ゆきひろです
もりきゅうです。
もりきゅうです。
もりきゅうです。
わたなべです.
もりきゅうです。
なかだです。
もりきゅうです。
もりきゅうです。
なかだです。
もりきゅうです。
[#28441] constant in module_eval — Kenichi Komiya <kom@...1.accsnet.ne.jp>
[#28454] Ruby 初心者は! — 有瀬 和徳 <crush@...>
Kazunori Aruse
[#28485] ruby/tk TkEntry#selection_present bug? — Noritsugu Nakamura <nnakamur@...>
新井です。
永井@知能.九工大です.
永井@知能.九工大です.
新井です。
永井@知能.九工大です.
永井@知能.九工大です.
まつもと ゆきひろです
永井@知能.九工大です.
新井です。
[#28530] テキストファイルを固定文字数で切って、行番号をつけるプログラム — Keisuke Minami <keisuke@...>
こんばんは。三並です。
新井です。
[#28536] DATA.rewind — URA Takefumi <hage@...>
浦と申します。
[#28565] 海外無料サーバ — 有瀬 和徳 <crush@...>
有瀬です。
[#28577] field sort — Kenji Noda <zaq94465a@...>
野田と申します
[#28599] 1.6 のダウンロードマニュアルが圧縮されていない? — Keisuke Minami <keisuke@...>
こんばんは。三並です。
From: Keisuke Minami <keisuke@rccn.com>
SHIBATA Hiroshiです。
In message "[ruby-list:28602] Re: 1.6 のダウンロードマニュアルが圧縮されていない?"
SHIBATA Hiroshiです。
From: Keisuke Minami <keisuke@rccn.com>
newです.
From: "丹生 光則 Nibu,Mitsunori." <nibu@tec.osaka.jip.co.jp>
newです.
From: "丹生 光則 Nibu,Mitsunori." <nibu@tec.osaka.jip.co.jp>
さくです。
青木@横浜です。
From: Daisuke Aoki <dai@sweetparty.ne.jp>
青木@横浜です。
Toshです。
From: Toshiro Kuwabara <toshirok@yb3.so-net.ne.jp>
Toshです。
青木@横浜です。
青木@横浜です。
[#28630] nest of Hash.new — Sato Hiroshi <hiroshi@...>
佐藤です.
[#28642] substr — Akihiro Yamauchi <aygoofy@...>
こんばんは。
[#28660] ruby termios library — akira yamada / やまだあきら <akira@...>
[#28691] Dir#glob of mswin32 — "たけ(tk)" <ggb03124@...>
mswin32 の Dir#glob はパスを入れても、パスを無視してしまうようです。
[#28715] GC — OHARA Shigeki <os@...>
大原です。
[#28764] Win32_process.create PID — Koga Atsushi <kog@...>
みなさまこんばんわ。
artonです。
[#28773] [Q] ChibiXML のサンプルみたいなもの — eda@...
えだです。
高橋征義です。
まつもと ゆきひろです
うえの@ぶるーすかいです。
[#28780] revenge of shell.rb — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
[#28789] freeze した文字列の書き換えチェック方法 — nekurai@...
ども、根暗井です ^^)
[#28794] undef singleton method — "K.Kosako" <kosako@...>
特異メソッドを未定義(undef)にするには、
[#28798] RubyUnit で、 initialize メソッドのようなことをしたい — "IKAGAWA, Kauztomo" <k_ikagawa@...>
お世話になります。いかがわと申します。
[#28814] fgets — Kazuhiro NISHIYAMA <zn@...>
C言語のfgetsのようなサイズ制限付きのgetsをしようとすると
[#28852] Re: [ruby-ext:01642] Re: o_dbm — keiju@... (石塚圭樹)
けいじゅ@日本ラショナルソフトウェアです.
けいじゅ@日本ラショナルソフトウェアです.
けいじゅ@日本ラショナルソフトウェアです.
[#28855] NetBSD BSD/OS curses — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#28862] media watch 2001.03.18 — Noritsugu Nakamura <nnakamur@...>
[#28864] patch glob for MSWin32 ruby-1.6.3 — arton <arton@...>
artonです。
[#28881] 初歩的な質問 — Kenji Noda <zaq94465a@...>
野田です。
[#28887] cygwin で組み込み — "shibata kenji" <shibata@...>
柴田です。
わたなべです。
わたなべ様ありがとうございます。
[#28901] Numeric.new — "たけ(tk)" <ggb03124@...>
Numeric.new があって Fixnum.new がないようです。Fixnum はいいとして、
原です。
たけ(tk)です。
[#28903] lndir.rb でエラー — みかみ まさと <kofukan@...>
みなさん、こんにちは。みかみにございます。
[#28911] media watch 2001.03.22 — akira yamada / やまだあきら <akira@...>
こんばんは。三並です。
前田です。
こんばんは。三並です。
Keisuke Minami さん、こんにちは。Ta-ku-ya II です。
こんばんは。三並です。
Keisuke Minami さん、こんにちは。Ta-ku-ya II です。
[#28919] RD の Reference について — Kenta MURATA <muraken2@...>
むらけんです.
前田です。
[#28954] erb のバグ (ローカル変数が未定義になってしまう) — Keisuke Minami <keisuke@...>
こんにちは。三並です。
[#28963] Re: 9p L 3〜10 P 2 L 2 回目 — Naoto Hiroshima <taisei-in@...>
こんにちは(^_^)
[#29021] [ruby/GD] GD.so not found? — AKJ <ml@...>
はじめて参加させていただきます。
[#29023] 配列に要素を挿入 — Kenji Noda <zaq94465a@...>
野田と申します
From: Kenji Noda <zaq94465a@cat.zero.ad.jp>
箱崎です。
Hiroshi Hakozaki wrote:
新井です。
新井です。
[#29037] forwardable-1.0 release — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
Toshです。
まつもと ゆきひろです
Toshです。
けいじゅ@日本ラショナルソフトウェアです.
Toshです。
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
わたなべです。
けいじゅ@日本ラショナルソフトウェアです.
[ruby-list:28396] Re: question of pipe , thread and queue
けいじゅ@日本ラショナルソフトウェアです.
In [ruby-list :28241 ] the message: "[ruby-list:28241] Re: question of
pipe , thread and queue ", on Feb/25 00:35(JST) Yukihiro Matsumoto
writes:
>まつもと ゆきひろです
>|>たぶん、threadとforkを組み合わせてるのがイカンのでは?
>|>現在disableにしてる fork_and_kill_other_threads を on にする
>|>とこの問題は発生しないようです。
>|
>|うぅ. デフォルトの動作はこれじゃなかったんでしたっけ?
>
>違います。いろいろモメたので。
うーん. どうなんですかねぇ... 今回のようにIOをポーリングしているスレッド
があると必ず問題になりますし. ライブラリを使う側がライブラリのスレッドが
勝手にやっていることの責任まで持つのはどうかと思うのですが...
でも, close-on-exec何かとの対称性から言えばこのままで良いのかしら... こ
れもforkする側が責任を持ってやれってことですからね...
>|良く考えたら, 必要ないIOをクローズしていないんですね. それではちょっと行
>|儀が悪いかなと... 過去のMLにもこの話題がありましたが, 推薦解がよくわかり
>|ませんでした. 推薦解としてはどういうものがあるでしょう?
>
>いまんとこ、決定打はないように思います。
簡単に, close-on-exec(じゃないもの)を指定できるインターフェイスが欲しい
ですね.
IO.set_all_close_on_exec_except(STDIO,...)
とか. または, openしているioをすべて取り出すインターフェイスがあっても良
いですが...
IO.set_close_on_exec(IO.all_open - [STDIO, ...])
それはそれでもんだいなんですが. ともかく.
例のやつダイブできたのですがまた問題が発生しています.
最後に添付したプログラムで
% ruby pipe-sample.rb 2
とすると. ls|sort|head するのですが, 時々同じファイル名を複数返してきま
す... どう見てもプログラムのせいではないと思えるんですよね.
ちなみに,
% ruby pipe-sample.rb 2 p
でログをとると,
1548:put<sort>->8:0[test-shell.rb.~1~]
1548:put<sort>->8:0[test-thread.rb]
1548:close<sort>
1548:get<sort><-4:0[Makefile]
1548:put<head>->10:0[Makefile]
1548:get<sort><-4:0[Makefile]
1548:get<sort><-4:1[Obsolate]
こんな感じで, sortからMakefileが2回返ってきています. 入力は1回しかないの
に...
いったいどうしてでしょう?
#--
require "thread"
class TestShell
def initialize(com)
@com = com
@pipe_me_in, @pipe_peer_out = IO.pipe
@pipe_peer_in, @pipe_me_out = IO.pipe
# Tracer.on
Thread.critical = true
@pid = fork {
Thread.critical = true
Thread.list.each{|th| th.kill unless th.equal?(Thread.current)}
print "#{$$}:start<#{@com}>\n" if PRINT
# Thread.critical = true
# @pipe_me_in.close
# @pipe_me_out.close
ObjectSpace.each_object(IO){|io|
if [@pipe_peer_in, @pipe_peer_out, STDIN, STDOUT, STDERR].include?(io)
else
io.close unless io.closed?
end
}
STDIN.reopen(@pipe_peer_in)
Tracer.off
STDOUT.reopen(@pipe_peer_out)
exec(com)
}
# Tracer.off
@pipe_peer_in.close
@pipe_peer_out.close
Thread.critical = false
Thread.start do
begin
# loop do
Process.waitpid(@pid)
# return if Process.waitpid(@pid, Process::WNOHANG)
# sleep 0.2
# end
rescue Errno::ECHILD
ensure
if PRINT
Thread.critical = true
print "#{$$}:Finish<#{@com}>\n"
Thread.critical = false
end
end
end
@queue = Queue.new
Thread.start do
if PRINT
Thread.critical = true
print "#{$$}:pipe_in<#{@com}>#{@pipe_me_in.fileno}\n"
Thread.critical = false
end
while l = @pipe_me_in.gets
if PRINT
Thread.critical = true
print "#{$$}:get<#{@com}><-#{@pipe_me_in.fileno}:#{@queue.size}[#{l.chop}]\n"
Thread.critical = false
end
@queue.push l
end
if PRINT
Thread.critical = true
print "#{$$}:get<#{@com}>[END]\n"
Thread.critical = false
end
@queue.push :EOF
end
end
def each
while (l = @queue.pop) != :EOF
yield l
end
end
def set_input(sh)
@input = sh
Thread.start do
if PRINT
Thread.critical = true
print "#{$$}:pipe_out<#{@com}>#{@pipe_me_out.fileno}\n"
Thread.critical = false
end
begin
@input.each{|l|
if PRINT
Thread.critical = true
print "#{$$}:put<#{@com}>->#{@pipe_me_out.fileno}:#{@queue.size}[#{l.chop}]\n"
Thread.critical = false
end
@pipe_me_out.print l
}
rescue Errno::EPIPE
ensure
if PRINT
Thread.critical = true
print "#{$$}:close<#{@com}>\n"
Thread.critical = false
end
@pipe_me_out.flush
@pipe_me_out.close
end
end
end
end
STDOUT.sync = true
Thread.abort_on_exception=true
if ARGV.include?("p")
PRINT = true
else
PRINT = false
end
require "tracer"
Tracer.add_filter do
|event, file, line, id, binding|
File::dirname(file) == "." or File::dirname(file) == "sample"
end
if ARGV.include?("t")
Tracer.on
end
if ARGV.include?("1")
ls = TestShell.new("ls")
head = TestShell.new("head")
#sleep 1
head.set_input(ls)
#sleep 1
#p ls.instance_eval{@queue}
for l in head
print l
end
end
if ARGV.include?("1s")
ls = TestShell.new("ls")
sort = TestShell.new("sort")
#sleep 1
sort.set_input(ls)
#sleep 1
#p ls.instance_eval{@queue}
for l in sort
print l
end
end
if ARGV.include?("1u")
ls = TestShell.new("ls")
uniq = TestShell.new("uniq -d")
#sleep 1
uniq.set_input(ls)
#sleep 1
#p ls.instance_eval{@queue}
for l in uniq
print l
end
end
if ARGV.include?("2")
ls = TestShell.new("ls")
# sleep 1
sort = TestShell.new("sort")
sort.set_input(ls)
# sleep 0.4
head = TestShell.new("head")
head.set_input(sort)
#p ls.instance_eval{@queue}
for l in head
print l
end
end
if ARGV.include?("2ch")
ls = TestShell.new("ls")
# sleep 1
cat = TestShell.new("cat")
cat.set_input(ls)
# sleep 0.4
head = TestShell.new("head")
head.set_input(cat)
#p ls.instance_eval{@queue}
for l in head
print l
end
end
if ARGV.include?("3")
ls = TestShell.new("ls")
# sleep 1
cat = TestShell.new("cat")
cat.set_input(ls)
sort = TestShell.new("sort")
sort.set_input(cat)
# sleep 0.4
head = TestShell.new("head")
head.set_input(sort)
#p ls.instance_eval{@queue}
for l in head
print l
end
end
__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju@rational.com <<---