坂野 正明です。

自己フォローです。
# Subject変更しました。

At Sat, 26 Jan 2002 03:36:39 +0900,
I wrote:
> あるライブラリ(具体的には、pty)が静的にリンクされているかどうか、
> 簡単に調べる方法はありませんか?

これって、よく考えたら、Ruby の問題と言うより、UNIXの問題の気が
してきた… (^^; 例えば、
	% nm ruby | grep pty
くらいで、大体分かりそうですね… (失礼しました)。


> でも、"pty" の挙動がおかしい、と…。

これに関し、思いついたことがあって、試したところ、原因が分かりました。
# なまじ複数のOSでうまくいったので、そこが問題だとはなかなか
# 気づきませんでした…。
以下、症状と対策とを報告します。

==========

○環境
  ・FreeBSD 4.4-RELEASE
	ruby 1.6.6 (2001-12-26) [i386-freebsd4.4]	(ext/* は動的リンク)
  ・SunOS 5.7 (Solaris 2.7)
	ruby 1.6.6 (2001-12-26) [sparc-solaris2.7]	(ext/* は静的リンク)
	# tcltklib のコンパイルでこけるので、それだけ外している

○症状1
  PTY.spawn した相手(wf)に、wf.print した時、
	FreeBSD (Linux) では相手に即座に渡るが、
	Solaris では、渡らない。結果的に、プログラムがそこで
	中断してしまう可能性大。

○原因
  flush のタイミングがかなり異なるらしい。つまり、Solaris では、
  なかなか flush されない(ひょっとしたら環境依存?)。

○対策
  1. PTY.spawn の直後に、wf.sync=true のおまじないを唱えておく
  あるいは、
  2. wf.print の直後(or 止まっては困る場所より前)に、wf.flush を入れる


○症状2
  相手(wf)が終了後にIO(rf)を要求した時の、エラーの種類が異なる。

  ★サンプルプログラム
#--------------------------------------------------------
require "pty";
require "expect";

begin
PTY.spawn("ed /tmp/naiyo"){|rf,wf,pid|
  $expect_verbose = true;
  wf.sync=true
  rf.expect(/nai.*\n/x) {
    wf.print "Q\n"                      ;# Process ends.
  }

  rf.expect(/Ex/){ true }		;# Error
}

rescue  => reigai
  p reigai
  # FreeBSD => RuntimeError, SunOS => Errno::EIO
end
#--------------------------------------------------------

  上の rescue の項に書いたように、出るエラーの種類が異なる。

# スクリプトは本来OS非依存なのが、ひとつの長所のはずですが、
# この辺になると、そうもいかないようで、難しいですね…。

==========

さかのまさあき