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
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 した場合はちゃんと動いています。
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 が使えているのが不思議です。
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) がなくても同様の結果になります。
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 しかないので。)
AC_DEFINE(DONT_ADD_BYTE_AT_END)の追加だけだと思います。