Nobuo Yamashita
nobsu****@sampo*****
2006年 2月 9日 (木) 17:15:55 JST
nobsun です. make-thread で作ったスレッドからプロセス起動させ,起動したプロセスを make-thread で作った別のスレッドからSIGTERMを送って停止させようとしています. 以下のようなコードを loop.scm と run-kill.scm を用意して run-kill.scm を走らせると,(Gauche は CVS HEAD のものです) Linux 2.6.12 glibc-2.3.5 のマシンでは, $ ./run-kill.scm #?="././run-kill.scm":21:(process-wait-any #t) #?- #f SIGTERM #?="././run-kill.scm":21:(process-wait-any #t) #?- #<process 3422 "./loop.scm" inactive> Done killing と期待どおりに動くのですが, Linux 2.4.27 glibc-2.3.2 のマシンでは, $ ./run-kill.scm #?="././run-kill.scm":21:(process-wait-any #t) *** UNCAUGHT-EXCEPTION Stack Trace: _______________________________________ 0 (print "Done killing") At line 23 of "././run-kill.scm" 1 (thread-join! (thread-start! (make-thread (lambda () (process-send ... At line 16 of "././run-kill.scm" のようにエラーになってしまいます. また,Mac OS X では期待どおりの挙動になります. ちゃんと調べてないので,現象の報告のみですが, Linux 2.4.27 glibc-2.3.2 での pthread の実装が???なのかしらん. --nobsun loop.scm ------------------------------------------------------------ #!/usr/bin/env gosh (define (main args) (define (loop) (loop)) (set-signal-handler! SIGTERM (lambda _ (print "\nSIGTERM") (exit 0))) (loop)) run-kill.scm -------------------------------------------------------- #!/usr/bin/env gosh (use gauche.process) (use gauche.threads) (define p #f) (define (main arg) (thread-join! (thread-start! (make-thread (lambda () (begin (sys-sigmask SIG_SETMASK (make <sys-sigset>)) (set! p (run-process "./loop.scm")) ))))) (thread-join! (thread-start! (make-thread (lambda () (process-send-signal p SIGTERM) (do () (#?=(process-wait-any #t)) (sys-sleep 1)) )))) (print "Done killing"))