[BUG?] SIGTERM $B$N<h$j07$$(B

e$B1J0f!wCNG=!%6e9)Bg$G$9!%e(B

e$B:#:"5$IU$/$H$$$&$N$bLdBj$J$N$G$9$,e(B (^_^;e$B!$e(B

Wed Oct 18 23:02:40 2006 Nobuyoshi N. [email protected]
* signal.c (Init_signal): handle SIGTERM. fixed:
[ruby-list:42895]

e$B$Ne(B commit e$B$N7k2L!$%G%U%)%k%H$N>uBV$G$Oe(B
SIGTERM (kill e$B%3%^%s%I$N%G%U%)%k%He(B) e$B$Ge(B
ruby e$B%W%m%;%9$r;&$;$J$/$J$C$F$$$^$9!%e(B

TERM e$B%7%0%J%k$KBP$7$Fe(B signal_exec() e$B$r8F$V$,!$e(B

SIGTERM e$B$N5-=R$,$J$$$N$G2?$b$;$:$KH4$1$F$7$^$&$?$a!%e(B

kill e$B$GAGD>$K;`$s$G$/$l$J$$$N$OLdBj$@$H;W$$$^$9!%e(B

e$BC1=c$K$O$3$&$G$7$g$&$+!)e(B

e$B%a%C%;!<%8$,e(B “ruby: SIGTERM (SignalException)”

e$B$H$J$C$F$7$^$&$N$,e(B

e$B>/$73J9%0-$$5$$b$7$^$9$,!%!%!%e(B

Index: signal.c

— signal.c (revision 12010)
+++ signal.c (working copy)
@@ -413,6 +413,9 @@
#ifdef SIGQUIT
case SIGQUIT:
#endif
+#ifdef SIGTERM

  •     case SIGTERM:
    

+#endif
#ifdef SIGALRM
case SIGALRM:
#endif
@@ -680,6 +683,9 @@
#ifdef SIGQUIT
case SIGQUIT:
#endif
+#ifdef SIGTERM

  •     case SIGTERM:
    

+#endif
#ifdef SIGALRM
case SIGALRM:
#endif

e$B$J$+$@$G$9!#e(B

At Thu, 8 Mar 2007 17:10:53 +0900,
Hidetoshi NAGAI wrote in [ruby-dev:30505]:

kill e$B$GAGD>$K;`$s$G$/$l$J$$$N$OLdBj$@$H;W$$$^$9!%e(B

e$B$9$$$^$;$s!"$?$7$+$K$^$:$$$G$9!#e(B

e$BC1=c$K$O$3$&$G$7$g$&$+!)e(B

e$B%a%C%;!<%8$,e(B “ruby: SIGTERM (SignalException)” e$B$H$J$C$F$7$^$&$N$,e(B

e$B>/$73J9%0-$$5$$b$7$^$9$,!%!%!%e(B

e$B$I$&$J$k$N$,$$$$$s$G$7$g$&!#%H%C%W%l%Y%k$^$GH4$1$?$H$3$m$G!"e(B
SIG_DFLe$B$KLa$7$F:FEYe(Bkill()?

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:30509] Re: [BUG?] SIGTERM
e$B$N<h$j07$$e(B”
on Fri, 9 Mar 2007 01:06:46 +0900, Nobuyoshi N.
[email protected] writes:

|> # e$B%a%C%;!<%8$,e(B “ruby: SIGTERM (SignalException)” e$B$H$J$C$F$7$^$&$N$,e(B
|> # e$B>/$73J9%0-$$5$$b$7$^$9$,!%!%!%e(B
|
|e$B$I$&$J$k$N$,$$$$$s$G$7$g$&!#%H%C%W%l%Y%k$^$GH4$1$?$H$3$m$G!"e(B
|SIG_DFLe$B$KLa$7$F:FEYe(Bkill()?

e$B%H%C%W%l%Y%k$GNc30$,e(Brb_eSignale$B$N$H$-!"%a%C%;!<%8$r=P$5$:$K=*e(B
e$BN;$9$k$N$,$h$$$N$G$O$J$$$+$H!#e(B

e$B$J$+$@$G$9!#e(B

At Fri, 9 Mar 2007 07:42:56 +0900,
Yukihiro M. wrote in [ruby-dev:30510]:

|> # e$B%a%C%;!<%8$,e(B “ruby: SIGTERM (SignalException)” e$B$H$J$C$F$7$^$&$N$,e(B
|> # e$B>/$73J9%0-$$5$$b$7$^$9$,!%!%!%e(B
|
|e$B$I$&$J$k$N$,$$$$$s$G$7$g$&!#%H%C%W%l%Y%k$^$GH4$1$?$H$3$m$G!"e(B
|SIG_DFLe$B$KLa$7$F:FEYe(Bkill()?

e$B%H%C%W%l%Y%k$GNc30$,e(Brb_eSignale$B$N$H$-!"%a%C%;!<%8$r=P$5$:$K=*e(B
e$BN;$9$k$N$,$h$$$N$G$O$J$$$+$H!#e(B

e$B?F%W%m%;%9$G$Oe(BWIFSIGNALEDe$B$H$+e(BWTERMSIGe$B$,<h$l$k$3$H$r4|BT$7$F$$$ke(B
e$B$N$G$O$J$$$+$H;W$C$?$s$G$9$,!"$=$3$^$G$OI,MW$J$7e(B?

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:30513] Re: [BUG?] SIGTERM
e$B$N<h$j07$$e(B”
on Fri, 9 Mar 2007 09:22:07 +0900, Nobuyoshi N.
[email protected] writes:

|> e$B%H%C%W%l%Y%k$GNc30$,e(Brb_eSignale$B$N$H$-!“%a%C%;!<%8$r=P$5$:$K=*e(B
|> e$BN;$9$k$N$,$h$$$N$G$O$J$$$+$H!#e(B
|
|e$B?F%W%m%;%9$G$Oe(BWIFSIGNALEDe$B$H$+e(BWTERMSIGe$B$,<h$l$k$3$H$r4|BT$7$F$$$ke(B
|e$B$N$G$O$J$$$+$H;W$C$?$s$G$9$,!”$=$3$^$G$OI,MW$J$7e(B?

e$B$$$d!"e(Berror_printe$B$,%a%C%;!<%8$rI=<($7$J$$$@$1$G!“e(Brescuee$B$9$le(B
e$B$PJaB*$G$-$k$H;W$$$^$9!#$C$F!”$=$&$$$&0UL#$8$c$J$$!)e(B

e$B1J0f!wCNG=!%6e9)Bg$G$9!%e(B

From: Nobuyoshi N. [email protected]
Subject: [ruby-dev:30513] Re: [BUG?] SIGTERM e$B$N<h$j07$$e(B
Date: Fri, 9 Mar 2007 09:22:07 +0900
Message-ID:
[email protected]

e$B?F%W%m%;%9$G$Oe(BWIFSIGNALEDe$B$H$+e(BWTERMSIGe$B$,<h$l$k$3$H$r4|BT$7$F$$$ke(B
e$B$N$G$O$J$$$+$H;W$C$?$s$G$9$,!"$=$3$^$G$OI,MW$J$7e(B?

e$BI,MW$J$N$G$7$g$&$M!%e(B
e$B:G=i$Oe(B exit(SIGTERM) e$B$G$b$$$$$N$+$J$H$b;W$$$^$7$?$,e(B
(^
^;e$B!$e(B
e$B3N$+$Ke(B SIG_DFL e$B$G;OKv$7$F$b$i$o$J$$$H6q9g$$$,0-$=$&$G$9!%e(B

e$B!V$8$c$“e(B HUP, QUIT e$B$O$$$$$N$+!)!W$C$FOC$b$”$j$^$9$,!%!%!%e(B

e$B$J$+$@$G$9!#e(B

At Fri, 9 Mar 2007 10:42:22 +0900,
Hidetoshi NAGAI wrote in [ruby-dev:30516]:

e$B$N$G$O$J$$$+$H;W$C$?$s$G$9$,!"$=$3$^$G$OI,MW$J$7e(B?

e$BI,MW$J$N$G$7$g$&$M!%e(B
e$B:G=i$Oe(B exit(SIGTERM) e$B$G$b$$$$$N$+$J$H$b;W$$$^$7$?$,e(B (^^;e$B!$e(B
e$B3N$+$Ke(B SIG_DFL e$B$G;OKv$7$F$b$i$o$J$$$H6q9g$$$,0-$=$&$G$9!%e(B

e$B!V$8$c$“e(B HUP, QUIT e$B$O$$$$$N$+!)!W$C$FOC$b$”$j$^$9$,!%!%!%e(B

SignalExceptione$B$He(BInterrupte$B$N4X78$,HyL/$G$9$,!#e(B

$ trap “:” 2
$ for sig in HUP INT QUIT TERM; do

echo $sig; ./ruby -esleep & usleep 100000; kill -$sig $!; fg
echo $?; echo ----------
done
HUP
[1] 25936
./ruby -esleep
e$B%O%s%0%"%C%We(B
129


INT
[1] 25938
./ruby -esleep
-e:1:in `sleep’: Interrupt
from -e:1

130

QUIT
[1] 25940
./ruby -esleep
e$B=*N;e(B (core dumped)
131

TERM
[1] 25943
./ruby -esleep
e$B=*N;$7$^$7$?e(B
143

Index: intern.h

— intern.h (revision 12021)
+++ intern.h (working copy)
@@ -212,5 +212,5 @@ VALUE rb_thread_create _((VALUE ()(ANYA
void rb_thread_interrupt _((void));
void rb_thread_trap_eval _((VALUE, int, int));
-void rb_thread_signal_raise _((char
));
+void rb_thread_signal_raise _((int));
void rb_thread_signal_exit _((void));
int rb_thread_select _((int, fd_set *, fd_set *, fd_set *, struct
timeval *));
@@ -395,4 +395,5 @@ void rb_trap_exit _((void));
void rb_trap_exec _((void));
const char ruby_signal_name _((int));
+void ruby_default_signal _((int));
/
sprintf.c /
VALUE rb_f_sprintf _((int, VALUE
));
Index: eval.c

— eval.c (revision 12021)
+++ eval.c (working copy)
@@ -1493,4 +1493,7 @@ error_handle(ex)
status = sysexit_status(ruby_errinfo);
}

  • else if (rb_obj_is_instance_of(ruby_errinfo, rb_eSignal)) {
  •  /* no message when exiting by signal */
    
  • }
    else {
    error_print();
    @@ -1580,7 +1583,13 @@ ruby_cleanup(ex)
    POP_TAG();
  • if (err && rb_obj_is_kind_of(err, rb_eSystemExit)) {
  • VALUE st = rb_iv_get(err, “status”);
  • return NUM2INT(st);
  • if (err) {
  • if (rb_obj_is_kind_of(err, rb_eSystemExit)) {
  •  VALUE st = rb_iv_get(err, "status");
    
  •  return NUM2INT(st);
    
  • }
  • else if (rb_obj_is_kind_of(err, rb_eSignal)) {
  •  VALUE sig = rb_iv_get(err, "signo");
    
  •  ruby_default_signal(NUM2INT(sig));
    
  • }
    }
    return ex;
    @@ -10156,5 +10165,4 @@ static NODE *th_raise_node;
    static VALUE th_cmd;
    static int th_sig, th_safe;
    -static char *th_signm;

#define RESTORE_NORMAL 1
@@ -10262,5 +10270,5 @@ rb_thread_switch(n)
break;
case RESTORE_SIGNAL:

  • rb_raise(rb_eSignal, “SIG%s”, th_signm);
  • rb_thread_signal_raise(th_sig);
    break;
    case RESTORE_EXIT:
    @@ -12263,11 +12271,13 @@ rb_thread_interrupt()
    void
    rb_thread_signal_raise(sig)
  • char *sig;
  • int sig;
    {
  • if (sig == 0) return; /* should not happen */
    rb_thread_critical = 0;
    if (curr_thread == main_thread) {
  • VALUE argv[1];
  • rb_thread_ready(curr_thread);
  • rb_raise(rb_eSignal, “SIG%s”, sig);
  • argv[0] = INT2FIX(sig);
  • rb_exc_raise(rb_class_new_instance(1, argv, rb_eSignal));
    }
    rb_thread_ready(main_thread);
    @@ -12277,5 +12287,5 @@ rb_thread_signal_raise(sig)
    }
    }
  • th_signm = sig;
  • th_sig = sig;
    curr_thread = main_thread;
    rb_thread_restore_context(curr_thread, RESTORE_SIGNAL);
    Index: signal.c
    ===================================================================
    — signal.c (revision 12021)
    +++ signal.c (working copy)
    @@ -171,5 +171,5 @@ static struct signals {
    static int
    signm2signo(nm)
  • char *nm;
  • const char *nm;
    {
    struct signals *sigs;
    @@ -201,4 +201,91 @@ ruby_signal_name(no)

/*

    • call-seq:
    • SignalException.new(sig) => signal_exception
    • Construct a new SignalException object. +sig+ should be a known
    • signal name, or a signal number.
  • */

+static VALUE
+esignal_init(argc, argv, self)

  • int argc;
  • VALUE *argv;
  • VALUE self;
    +{
  • int argnum = 1;
  • VALUE sig = Qnil;
  • int signo;
  • const char *signm;
  • char tmpnm[(sizeof(int)*CHAR_BIT)/3+4];
  • if (argc > 0) {
  • sig = argv[0];
  • if (FIXNUM_P(sig)) argnum = 2;
  • }
  • if (argc < 1 || argnum < argc) {
  • rb_raise(rb_eArgError, “wrong number of arguments (%d for %d)”,
  • argc, argnum);
    
  • }
  • if (argnum == 2) {
  • signo = FIX2INT(sig);
  • if (signo < 0 || signo > NSIG) {
  •  rb_raise(rb_eArgError, "invalid signal number (%d)", signo);
    
  • }
  • if (argc > 1) {
  •  sig = argv[1];
    
  • }
  • else {
  •  signm = signo2signm(signo);
    
  •  if (signm) {
    
  • snprintf(tmpnm, sizeof(tmpnm), “SIG%s”, signm);
  •  }
    
  •  else {
    
  • snprintf(tmpnm, sizeof(tmpnm), “SIG%u”, signo);
  •  }
    
  •  sig = rb_str_new2(signm = tmpnm);
    
  • }
  • }
  • else {
  • signm = SYMBOL_P(sig) ? rb_id2name(SYM2ID(sig)) :
    StringValuePtr(sig);
  • if (strncmp(signm, “SIG”, 3) == 0) signm += 3;
  • signo = signm2signo(signm);
  • if (!signo) {
  •  rb_raise(rb_eArgError, "unsupported name `SIG%s'", signm);
    
  • }
  • if (SYMBOL_P(sig)) {
  •  sig = rb_str_new2(signm);
    
  • }
  • }
  • rb_call_super(1, &sig);
  • rb_iv_set(self, “signo”, INT2NUM(signo));
  • return self;
    +}

+static VALUE
+interrupt_init(self, mesg)

  • VALUE self, mesg;
    +{
  • VALUE argv[2];
  • argv[0] = INT2FIX(SIGINT);
  • argv[1] = mesg;
  • return rb_call_super(2, argv);
    +}

+void
+ruby_default_signal(sig)

  • int sig;
    +{
    +#ifndef MACOS_UNUSE_SIGNAL
  • extern rb_pid_t getpid _((void));
  • signal(sig, SIG_DFL);
  • kill(getpid(), sig);
    +#endif
    +}

+/*

  • call-seq:
  • Process.kill(signal, pid, ...)    => fixnum
    

@@ -414,4 +501,7 @@ signal_exec(sig)
case SIGQUIT:
#endif
+#ifdef SIGTERM

  • case SIGTERM:
    +#endif
    #ifdef SIGALRM
    case SIGALRM:
    @@ -423,5 +513,5 @@ signal_exec(sig)
    case SIGUSR2:
    #endif
  •  rb_thread_signal_raise(signo2signm(sig));
    
  •  rb_thread_signal_raise(sig);
     break;
    

    }
    @@ -681,4 +771,7 @@ trap(arg)
    case SIGQUIT:
    #endif
    +#ifdef SIGTERM

  • case SIGTERM:
    +#endif
    #ifdef SIGALRM
    case SIGALRM:
    @@ -976,4 +1069,9 @@ Init_signal()
    rb_define_module_function(mSignal, “list”, sig_list, 0);

  • rb_define_method(rb_eSignal, “initialize”, esignal_init, -1);

  • rb_attr(rb_eSignal, rb_intern(“signo”), 1, 0, 0);

  • rb_alias(rb_eSignal, rb_intern(“signm”), rb_intern(“message”));

  • rb_define_method(rb_eInterrupt, “initialize”, interrupt_init, 1);

  • install_sighandler(SIGINT, sighandler);
    #ifdef SIGHUP

e$B$J$+$@$G$9!#e(B

ChangeLoge$B%(%s%H%j$r$D$1$F$^$;$s$G$7$?!#e(B

  • eval.c (error_handle): no message when exiting by signal.

  • eval.c (ruby_cleanup): re-send signal. [ruby-dev:30516]

  • eval.c (rb_thread_interrupt): instantiate SignalException.

  • eval.c (rb_thread_signal_raise): now takes signal number instead
    of signal name.

  • intern.h (rb_thread_signal_raise, ruby_default_signal): prototypes.

  • signal.c (esignal_init): takes a signal number and an optional
    signal name.

  • signal.c (interrupt_init): pass SIGINT always.

  • signal.c (ruby_default_signal): invoke system default signal
    handler.

  • signal.c (rb_signal_exec, trap): handle SIGTERM. [ruby-dev:30505]

e$B$D$$$G$Ke(B1.9e$BMQ!#e(B

  • eval.c (ruby_cleanup): re-send signal. [ruby-dev:30516]

  • eval_error.h (error_handle): no message when exiting by signal.

  • intern.h (rb_thread_signal_raise, ruby_default_signal): prototypes.

  • signal.c (esignal_init): takes a signal number and an optional
    signal name.

  • signal.c (interrupt_init): pass SIGINT always.

  • signal.c (ruby_default_signal): invoke system default signal
    handler.

  • signal.c (rb_signal_exec, trap): handle SIGTERM. [ruby-dev:30505]

  • thread.c (rb_thread_signal_raise): now takes signal number instead
    of signal name.

  • thread.c (rb_thread_signal_exit): since rb_make_exception() calls
    #exception method, rb_class_new_instance() is not needed here.

Index: eval.c

— eval.c (revision 12021)
+++ eval.c (working copy)
@@ -177,16 +177,18 @@ int
ruby_cleanup(int ex)
{

  • int state;
  • int state, exit_code = 0, signo = 0;
    volatile VALUE err = GET_THREAD()->errinfo;
    rb_vm_t *vm = GET_THREAD()->vm;

    /* th->errinfo contains a NODE while break’ing */

  • if (RTEST(err) && (TYPE(err) != T_NODE) &&
  • rb_obj_is_kind_of(err, rb_eSystemExit)) {
  • vm->exit_code = NUM2INT(rb_iv_get(err, “status”));
  • }
  • else {
  • vm->exit_code = 0;
  • if (RTEST(err) && (TYPE(err) != T_NODE)) {

  • if (rb_obj_is_kind_of(err, rb_eSystemExit)) {

  •  exit_code = NUM2INT(rb_iv_get(err, "status"));
    
  • }

  • else if (rb_obj_is_kind_of(err, rb_eSignal)) {

  •  signo = NUM2INT(rb_iv_get(err, "signo"));
    
  • }
    }

  • vm->exit_code = exit_code;

    GET_THREAD()->safe_level = 0;
    @@ -208,4 +210,7 @@ ruby_cleanup(int ex)
    POP_THREAD_TAG();

  • if (signo) {

  • ruby_default_signal(signo);

  • }
    if (vm->exit_code) {
    return vm->exit_code;
    Index: eval_error.h
    ===================================================================
    — eval_error.h (revision 12021)
    +++ eval_error.h (working copy)
    @@ -3,4 +3,7 @@
    */

+#ifndef RUBY_EVAL_ERROR_H
+#define RUBY_EVAL_ERROR_H
+
#define SET_CURRENT_SOURCE() ((void)0)

@@ -200,4 +203,5 @@ error_handle(int ex)
int status = EXIT_FAILURE;
rb_thread_t *th = GET_THREAD();

  • VALUE errinfo;

    if (thread_set_raised(th))
    @@ -235,6 +239,10 @@ error_handle(int ex)
    case TAG_RAISE:
    case TAG_FATAL:

  • if (rb_obj_is_kind_of(GET_THREAD()->errinfo, rb_eSystemExit)) {
  •  status = sysexit_status(GET_THREAD()->errinfo);
    
  • errinfo = GET_THREAD()->errinfo;
  • if (rb_obj_is_kind_of(errinfo, rb_eSystemExit)) {
  •  status = sysexit_status(errinfo);
    
  • }
  • else if (rb_obj_is_instance_of(errinfo, rb_eSignal)) {
  •  /* no message when exiting by signal */
    
    }
    else {
    @@ -249,2 +257,4 @@ error_handle(int ex)
    return status;
    }

+#endif /* RUBY_EVAL_ERROR_H */
Index: intern.h

— intern.h (revision 12021)
+++ intern.h (working copy)
@@ -278,5 +278,5 @@ VALUE rb_thread_kill(VALUE);
VALUE rb_thread_create(VALUE ()(ANYARGS), void);
void rb_thread_trap_eval(VALUE, int, int);
-void rb_thread_signal_raise(void , const char); /* should pass
literal */
+void rb_thread_signal_raise(void *, int);
void rb_thread_signal_exit(void *);
int rb_thread_select(int, fd_set *, fd_set *, fd_set *, struct timeval
*);
@@ -475,4 +475,5 @@ void rb_trap_exit(void);
void rb_trap_exec(void);
const char ruby_signal_name(int);
+void ruby_default_signal(int);
/
sprintf.c /
VALUE rb_f_sprintf(int, const VALUE
);
Index: signal.c

— signal.c (revision 12021)
+++ signal.c (working copy)
@@ -198,4 +198,82 @@ ruby_signal_name(int no)

/*

    • call-seq:
    • SignalException.new(sig) => signal_exception
    • Construct a new SignalException object. +sig+ should be a known
    • signal name, or a signal number.
  • */

+static VALUE
+esignal_init(int argc, VALUE *argv, VALUE self)
+{

  • int argnum = 1;
  • VALUE sig = Qnil;
  • int signo;
  • const char *signm;
  • if (argc > 0) {
  • sig = rb_check_to_integer(argv[0], “to_int”);
  • if (!NIL_P(sig)) argnum = 2;
  • }
  • if (argc < 1 || argnum < argc) {
  • rb_raise(rb_eArgError, “wrong number of arguments (%d for %d)”,
  • argc, argnum);
    
  • }
  • if (argnum == 2) {
  • signo = NUM2INT(sig);
  • if (signo < 0 || signo > NSIG) {
  •  rb_raise(rb_eArgError, "invalid signal number (%d)", signo);
    
  • }
  • if (argc > 1) {
  •  sig = argv[1];
    
  • }
  • else {
  •  signm = signo2signm(signo);
    
  •  if (signm) {
    
  • sig = rb_sprintf(“SIG%s”, signm);
  •  }
    
  •  else {
    
  • sig = rb_sprintf(“SIG%u”, signo);
  •  }
    
  • }
  • }
  • else {
  • signm = SYMBOL_P(sig) ? rb_id2name(SYM2ID(sig)) :
    StringValuePtr(sig);
  • if (strncmp(signm, “SIG”, 3) == 0) signm += 3;
  • signo = signm2signo(signm);
  • if (!signo) {
  •  rb_raise(rb_eArgError, "unsupported name `SIG%s'", signm);
    
  • }
  • if (SYMBOL_P(sig)) {
  •  sig = rb_str_new2(signm);
    
  • }
  • }
  • rb_call_super(1, &sig);
  • rb_iv_set(self, “signo”, INT2NUM(signo));
  • return self;
    +}

+static VALUE
+interrupt_init(VALUE self, VALUE mesg)
+{

  • VALUE argv[2];
  • argv[0] = INT2FIX(SIGINT);
  • argv[1] = mesg;
  • return rb_call_super(2, argv);
    +}

+void
+ruby_default_signal(int sig)
+{
+#ifndef MACOS_UNUSE_SIGNAL

  • signal(sig, SIG_DFL);
  • kill(getpid(), sig);
    +#endif
    +}

+/*

  • call-seq:
  • Process.kill(signal, pid, ...)    => fixnum
    

@@ -499,4 +577,7 @@ rb_signal_exec(rb_thread_t *th, int sig)
case SIGQUIT:
#endif
+#ifdef SIGTERM

  • case SIGTERM:
    +#endif
    #ifdef SIGALRM
    case SIGALRM:
    @@ -508,5 +589,5 @@ rb_signal_exec(rb_thread_t *th, int sig)
    case SIGUSR2:
    #endif
  •  rb_thread_signal_raise(th, signo2signm(sig));
    
  •  rb_thread_signal_raise(th, sig);
     break;
    

    }
    @@ -639,4 +720,7 @@ trap(struct trap_arg *arg)
    case SIGQUIT:
    #endif
    +#ifdef SIGTERM

  • case SIGTERM:
    +#endif
    #ifdef SIGALRM
    case SIGALRM:
    @@ -899,4 +983,9 @@ Init_signal(void)
    rb_define_module_function(mSignal, “list”, sig_list, 0);

  • rb_define_method(rb_eSignal, “initialize”, esignal_init, -1);

  • rb_attr(rb_eSignal, rb_intern(“signo”), 1, 0, 0);

  • rb_alias(rb_eSignal, rb_intern(“signm”), rb_intern(“message”));

  • rb_define_method(rb_eInterrupt, “initialize”, interrupt_init, 1);

  • install_sighandler(SIGINT, sighandler);
    #ifdef SIGHUP
    Index: thread.c
    ===================================================================
    — thread.c (revision 12021)
    +++ thread.c (working copy)
    @@ -753,16 +753,12 @@ rb_thread_raise(int argc, VALUE *argv, r

void
-rb_thread_signal_raise(void *thptr, const char *sig)
+rb_thread_signal_raise(void *thptr, int sig)
{

  • VALUE argv[1];
  • char buf[BUFSIZ];
  • VALUE argv[2];
    rb_thread_t *th = thptr;
  • if (sig == 0) {
  • return; /* should not happen */
  • }
  • snprintf(buf, BUFSIZ, “SIG%s”, sig);
  • argv[0] = rb_exc_new3(rb_eSignal, rb_str_new2(buf));
  • rb_thread_raise(1, argv, th->vm->main_thread);
  • argv[0] = rb_eSignal;
  • argv[1] = INT2FIX(sig);
  • rb_thread_raise(2, argv, th->vm->main_thread);
    }

@@ -770,12 +766,10 @@ void
rb_thread_signal_exit(void *thptr)
{

  • VALUE argv[1];
  • VALUE args[2];
  • VALUE argv[2];
    rb_thread_t *th = thptr;
  • args[0] = INT2NUM(EXIT_SUCCESS);
  • args[1] = rb_str_new2(“exit”);
  • argv[0] = rb_class_new_instance(2, args, rb_eSystemExit);
  • rb_thread_raise(1, argv, th->vm->main_thread);
  • argv[0] = rb_eSystemExit;
  • argv[1] = rb_str_new2(“exit”);
  • rb_thread_raise(2, argv, th->vm->main_thread);
    }

At Sat, 10 Mar 2007 06:14:45 +0900,
Nobuyoshi N. wrote:

親プロセスではWIFSIGNALEDとかWTERMSIGが取れることを期待している
のではないかと思ったんですが、そこまでは必要なし?

必要なのでしょうね.
最初は exit(SIGTERM) でもいいのかなとも思いましたが (^^;,
確かに SIG_DFL で始末してもらわないと具合いが悪そうです.

「じゃあ HUP, QUIT はいいのか?」って話もありますが...

SignalExceptionとInterruptの関係が微妙ですが。

 手元でもテストしました。1.8 へのコミットをお願いします。


/
/__ __ Akinori.org / MUSHA.org
/ ) ) ) ) / FreeBSD.org / Ruby-lang.org
Akinori MUSHA aka / (_ / ( (__( @ iDaemons.org / and.or.jp

“Different eyes see different things,
Different hearts beat on different strings –
But there are times for you and me when all such things agree”

e$B1J0fe(B@e$BCNG=!%6e9)Bg$G$9!%e(B

From: Nobuyoshi N. [email protected]
Subject: [ruby-dev:30519] Re: [BUG?] SIGTERM e$B$N<h$j07$$e(B
Date: Sat, 10 Mar 2007 06:14:45 +0900
Message-ID:
[email protected]

SignalExceptione$B$He(BInterrupte$B$N4X78$,HyL/$G$9$,!#e(B

e$B40A4$K=PCY$l$F$7$^$$$^$7$?$,!$F0:n$r3NG’$7$^$7$?!%e(B
e$B$"$j$,$H$&$4$6$$$^$7$?!%e(B