Gauche:MIPS-SGI-IRIX
run-process の挙動
hello.scm:
#!/usr/bin/env gosh (print "Hello, Gauche!")
hello.pl:
#!/usr/bin/env perl print "Hello, Perl!\n";
process.scm:
(use gauche.process) (let ((gosh (run-process "./hello.scm" )) (perl (run-process "./hello.pl" ))) (process-wait perl) (process-wait gosh) )
として、
gosh process.scm
とやると、Linux (RH9,Pentium4) では、
Hello, Perl! Hello, Gauche!
と表示される。一方 SGI のマシン (IRIX6.5,R12000) では、
Hello, Perl!
となり、なぜか、"Hello, Gauche!"が来ない、、、 一般に、Gauche スクリプトを Gauche スクリプトから呼び出すと SGI のマシンでは実行されないようだ。僕のマシンだけ?? configure がおかしかったのかしら。KINJO
- Shiro (2004/04/09 02:35:15 PDT) : 手元に環境が無いのでいじれないんですが、
問題を切り分けるため、色々試してもらえますか。
- (sys-system "./hello.scm") は走る?
- (run-process "gosh" "./hello.scm") は?
- hello.scmをフルパスで指定したら?
- KINJO 2004/04/09 21:05:14 PDT やってみました:
gosh> (sys-system "./hello.scm") 9
gosh> (run-process "gosh" "./hello.scm") #<process 197178 "gosh" active>
gosh> (run-process "/usr1/people/akinjo/tmp/hello.scm") #<process 197604 "/usr1/people/akinjo/tmp/hello.scm" active>
gosh> (sys-system "/usr1/people/akinjo/tmp/hello.scm") 9
となり、やはり、"Hello, Gauche!" はプリントされません。"9"が帰るってことは kill されてる? ちなみに perl スクリプトを 走らせるとこうなりました:
gosh> (sys-system "./hello.pl") Hello, Perl! 0
gosh> (run-process "perl" "./hello.pl") Hello, Perl! #<process 197363 "perl" active>
蛇足ですが、シェルから ./hello.scm した場合はちゃんと動いています。
- Shiro: うーんkillされてるみたいですね。なんでだろう。 (sys-system "gosh /usr1/people/akinjo/tmp/hello.scm") もだめ?
- KINJO: やはり、だめでした。("9" が返される)
- Shiro: シェル経由でもだめってことは、スクリプト云々以前の 話かなあ。(sys-system "gosh -V")とか、(sys-system "gosh -q -Eexit")も ダメですか。 シグナルのハンドリング中に同一シグナルを受けるとkillされることが あるけどそれかな? GC絡みとそれ以外とが考えられますが、まず src/main.cのmain()内のsig_setup()の呼び出しをコメントアウトして みて下さい。それで返るシグナルの値が変われば、GC以外の部分です。
- KINJO (2004/04/13 18:03:43 PDT): (sys-system "gosh -V") なども "9" を返します。「スクリプト云々以前」の問題でした。sig_setup() をコメントアウトした場合にもやはり "9" が返って来ます。
- Shiro (2004/04/13 20:05:38 PDT): ふーむ。GC絡みかなあ。Boehm GCを使う他の ちょっとしたプログラムをCで書いてsys-systemで起動してみるとか。 あと、sys-systemでgdbを起動してその中からgoshを実行するとか。 ちょいと手探りでやらないと見当がつかないっす。
- KINJO (2004/04/14 04:16:27 PDT): 面倒かけて恐縮です。どうも GC っぽいです。Boehm GC (Gauche と一緒に配られてるやつ)を使った簡単なCプログラムもやはり、sys-system で "9" が 返りました。gdb をインストールして シェルから起動すると、
shell$ gdb /usr/local/bin/gosh GNU gdb 6.1 .... (gdb) run Starting program: /usr/local/bin/gosh Program received signal SIGSEGV, Segmentation fault. 0x5ffb3c40 in GC_find_limit (p=0x7fff25c0 "", up=1) at os_dep.c:806 806 GC_noop1((word)(*result)); (gdb) print result $1 = 0x7fff8000 <Address 0x7fff8000 out of bounds> (gdb)
おやまあ、、、Gauche-0.7.4.2/gc/os_dep.c ということで、犯人は判明しました。 (直し方は知らないけど) Boehm GC がサポートしてない環境なのかなぁ。 それにしても、ふだんは gosh が使えているのが不思議です。
- Shiro(2004/04/14 04:55:56 PDT): あ、それは正常です>SEGV in GC_find_limit。 スタック境界を調べるために、わざといろんなアドレスにアクセスして SEGVが出るところを見ているからです。そこはちゃんとハンドルされるので、 最初のSEGVだけcontして下さい。
- KINJO (2004/04/15 00:32:24 PDT) えっと、よく意味が解からないんですけど、gdb で cont と入力するということですか?
- 上記のようにシェルから gdb /usr/local/bin/gosh とすると、run, cont, cont でgosh が正常に起動します。最初の cont では、やはり SEGV がでます。(Linux の方は run 一発で gosh が立ち上がるのですが)
- gosh の REPL から (sys-system "gdb /usr/local/bin/gosh") とすると、run の あと何度 cont をやっても os_dep.c:806 でSIGSEGV がでます。
- Shiro (2004/04/15 01:32:32 PDT): それは有力な情報です。 もしよければ、Boehm GCを使った簡単なCプログラムから、system(3)で 自身を呼ぶようなプログラムを書いてみて、再現するかどうかみてください。 それで再現するようならBoehm GCのMLで聞いてみます。
- KINJO (2004/04/15 03:01:15 PDT) 以下の C プログラムで再現されました。
shell$ cd Gauche-0.7.4.2/gc ; cat gc_hoge.c #include <stdlib.h> #include <stdio.h> #include <string.h> #include "gc.h" int main(int argc, char *argv[]) { char *x,*a; int n,sig=0; a = (argc > 1) ? strdup(argv[1]) : strdup("hoge?"); n = strlen(a); x = (char*) GC_malloc_atomic((n+1)*sizeof(char)); strcpy(x,a); printf("%s\n", x); fflush(stdout); sig = system("./hoge.out inside"); printf("hoge.out returned: %d\n", sig); fflush(stdout); return 0; } shell$ gcc -I./include gc_hoge.c .libs/libgc.a -o hoge.out shell$ ./hoge.out "keke?" keke? hoge.out returned: 9 shell$
てな具合です。ちなみに Linux PC の方では、
shell$ ./hoge.out "keke?" keke? inside inside ... (途中で Ctrl-C する) hoge.out returned: 2 hoge.out returned: 0 hoge.out returned: 0 ...
となります。なお、strcpy(x,a) がなくても同様の結果になります。
- Shiro: ども。環境も教えて頂ければ(OS, libgcのバージョンと できればconfiguration option)幸いです。
- KINJO (2004/04/15 04:35:58 PDT) : SGI製の octane2, MIPS R12000 (400MHz) の dual CPU, OS は IRIX64 6.5, ./configure のオプションは 「何もナシ」、と --enable-threads=pthreads の両方を試しました(同じ結果です)。libgc のバージョンは、Makefile によると、6.2 のようです(Gauche-0.7.4.2 についてきたやつです)。
- Shiro: GCのMLに投げときました。
- KINJO: どうもありがとうございます。
- Shiro(2004/04/15 19:40:23 PDT):「詳しい原因は不明だけれど、6.3alpha5ではそのへんの ロジックが変わっているので試してみてくれないか」とのことです。 ここから gc6.3alpha5.tar.gzを落として、上のテストプログラムを試してみてもらえますか? Gaucheに組み込むには数箇所いじる必要があるのですが、6.3alpha5で動くようなら 検討します。
- KINJO (2004/04/15 22:27:57 PDT): 6.3alpha5 で試してみたら動きました! ありがとうございました。でも、、、
shell$ ./hoge.out "keke?" keke? inside inside ... (途中で Ctrl-C する) hoge.out returned: -1 hoge.out returned: 0 hoge.out returned: 0 ...
となって、Ctrl-C したときに 2 ではなく -1 が返って来るのが気になります。とおもったら、Ctrl-C してないのに、しばらくすると(263回目の "inside" が表示されたあと) 勝手に終了していました。(これは単にメモリが少ないせいか? 256MB しかないので。)
- Shiro: systemの戻り値の仕様はOSによって違うので、そのせいでは?
あと、勝手に終了はもしかしてリソースの制限かなんかに引っかかったとか。
なお、Gaucheへの組み込み方ですが、gc/configure.inに数箇所、[SK]とマーク
されている箇所があるので、それを参考に6.3alpha5のconfigure.inを修正
してから、ツリーごとGauche-0.7.4.2/gc以下にコピーして
フルビルド(make maintainer-clean; ./DIST gen; ./configure; make)してみてください。
IRIXだけ動けば良いのなら、たぶん必要なのは
AC_DEFINE(DONT_ADD_BYTE_AT_END)
の追加だけだと思います。
- KINJO: できました。"DIST" がなかったので、無視して、あと src/Makefile の "../gc/.libs/*.o" を "../gc/.libs/libgc.so" にしてコンパイルができました。 ちゃんと (sys-system "./hello.scm") も "Hello, Gauche!" を表示します。 めでたし、めでたし。ながながとありがとうございました。