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)の追加だけだと思います。