From: nobu.nakada@... Date: 2002-01-26T10:05:06+09:00 Subject: [ruby-list:33546] Re: pty & expect (Re: Shared library) なかだです。 At Sat, 26 Jan 2002 07:14:02 +0900, Masaaki Sakano wrote: > % nm ruby | grep pty grep -w Init_ptyのほうが確実かも知れません。 > ○症状1 > PTY.spawn した相手(wf)に、wf.print した時、 > FreeBSD (Linux) では相手に即座に渡るが、 > Solaris では、渡らない。結果的に、プログラムがそこで > 中断してしまう可能性大。 > > ○原因 > flush のタイミングがかなり異なるらしい。つまり、Solaris では、 > なかなか flush されない(ひょっとしたら環境依存?)。 > > ○対策 > 1. PTY.spawn の直後に、wf.sync=true のおまじないを唱えておく > あるいは、 > 2. wf.print の直後(or 止まっては困る場所より前)に、wf.flush を入れる これはsyncにしとくべきでしょうね。 > ○症状2 > 相手(wf)が終了後にIO(rf)を要求した時の、エラーの種類が異なる。 Linux 2.4.17だとPTY::ChildExitedでした。SolarisのEIOはSIGCHLDと のタイミングの問題なのかと思いますが、RuntimeErrorになる理由は よく分かりません。 Index: pty.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/pty/pty.c,v retrieving revision 1.12 diff -u -2 -p -r1.12 pty.c --- pty.c 2001/11/27 10:00:33 1.12 +++ pty.c 2002/01/26 00:36:41 @@ -434,5 +434,5 @@ pty_getpty(argc, argv, self) rfptr->path = strdup(SlaveName); - wfptr->mode = rb_io_mode_flags("w"); + wfptr->mode = rb_io_mode_flags("w") | FMODE_SYNC; wfptr->f = fdopen(dup(info.fd), "w"); wfptr->path = strdup(SlaveName); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦