[Gauche-devel-jp] Different behavior of process-wait depend on Linux kernel version?

Back to archive index

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"))




Gauche-devel-jp メーリングリストの案内
Back to archive index