-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Am 12.10.2010 09:32, schrieb Robert Klemme:
> On Tue, Oct 12, 2010 at 9:10 AM, Andreas Otto
> <aotto1968 / users.sourceforge.net> wrote:
>> -----BEGIN PGP SIGNED MESSAGE-----
>> Hash: SHA1
>>
>> Hi,
>>
>> I writing a C-Extension for ruby using "rb_fork(0,0,0,Qnil)" to create a
>> new process.
>>
>> Behaviour:
>>
>> 1) before fork a SIGTERM send to the parent terminate the parent
>> 2) after fork a SIGTERM is ignored
> 
> Only in the parent?

I just test the parent.

> 
>> Analyze:
>>
>> SIGTERM is initialized in "Init_signal" using
>>
>> #ifdef SIGTERM
>>    install_sighandler(SIGTERM, sighandler);
>> #endif
>>
>> but the fork code does in "rb_fork_err"
>>
>> ...
>>    for (; before_fork(), (pid = fork()) < 0; prefork()) {
>>        after_fork();
>> ...
>>    after_fork();
>> ...
>>
>> The problem is the "after_fork" is called for parent and child:
>>
>> #define after_fork() (GET_THREAD()->thrown_errinfo = 0, after_exec())
>>
>> #define after_exec() \
>>  (rb_thread_reset_timer_thread(), rb_thread_start_timer_thread(),
>> forked_child = 0, rb_disable_interrupt())
>>
>> void
>> rb_disable_interrupt(void)
>> {
>> #if USE_TRAP_MASK
>>    sigset_t mask;
>>    sigfillset(&mask);
>>    sigdelset(&mask, SIGVTALRM);
>>    sigdelset(&mask, SIGSEGV);
>>    pthread_sigmask(SIG_SETMASK, &mask, NULL);
>> #endif
>> }
>>
>> and all signals are blocked except SIGVTALRM and SIGSEGV
>>
>> after adding
>>
>> sigdelset(&mask, SIGTERM);
>>
>> to rb_disable_interrupt the code is working but a real solution should
>> save the initial mask and later on enable the mask again ...
> 
> I doubt it is a good idea to use regular signal handling code to do
> this.  If at all you should probably use Ruby's methods.  Note that
> you get the old signal handler back when trapping:
> 
> irb(main):010:0> Process.kill "INT", $$
> => 1
> irb(main):011:0> Got signal   2
> 
> irb(main):012:0* Signal.trap("INT", &old)
> => #<Proc:0x1020e154@(irb):9>
> irb(main):013:0> Process.kill "INT", $$
> => 1
> irb(main):014:0> ^C
> irb(main):014:0> Process.kill "INT", $$
> => 1
> irb(main):015:0> ^C
> 
> I don't know your specific requirements but in Ruby you would probably do
> 
> fork do
>   # whatever client code
> end
> 
> Signal.trap 'TERM' do
>   $stderr.puts "Ignoring SIGTERM"
> end
> 
> Does that help?

My problem is just the opposite

I want that SIGTERM is *not* ignored ...
the original parent does end on SIGTERM
the parent *after* fork does not stop on SIGTERM


mfg, Andreas Otto
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.15 (GNU/Linux)
Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJMtEKEAAoJEGTcPijNG3/AVBwH/108Gs9xoKoFg92lrIZ0sGQM
EicxDgJ5hzK5M5PAM+agsKaq7Yrq4F3YcbY9TawmoetfTJ8rhyyvBAqAiXXc/jjk
ngR3+Yym7KOSXTZBskGXzwk7eqg5uPM+iufGcv7qVoBT/OhtRIfylbD2M+AMkf5U
U2wO4ZwSwEiI5SxUTm/jffJ4VKkF4MCw6XoDdgImkUsvyZswXjUhqlZy8pyePAl/
BIutY2A0oTprAXEhM3W+JnWsRzaB8Y8cnJu7KTTHKhF0EDW/tdzGetNHa0K08XFV
e/ODkJOQ/id5hDlIuj0LgWkIWpuoKvCNSH3ZixjFweGcV62m2DdPgkTbY0fM22s=
=S+jo
-----END PGP SIGNATURE-----