On 19 Jul 2006, at 8:25, <nobu / ruby-lang.org> <nobu / ruby-lang.org>  
wrote:
> > Solution is to add a call to 'rb_thread_atfork()' in the
> > child after fork() in order to kill off those other threads.
>
> Sounds reasonable.
Is it possible to get that fix into 1.8.5?

> > On a related theme, it seems like the 'rb_proc_exec' in
> > process.c:pipe_open() should be protected with rb_protect or
> > similar, to prevent any exceptions raised during
> > rb_proc_exec() from being propagated to the soon-to-be-dead
> > main thread in the child process. I'm not familiar enough
> > with use of rb_protect to provide a proper patch for that.
>
> The point would be any exceptions must not be raised after
> fork.
Well, an exception should probably just cause the interpreter to  
exit. It should not, for example, allow a subsequent exec() syscall  
to be invoked.

> It should be done in 1.9 almost, but it's bad time to
> backport that change from trunk now.

I wasn't sure from your enclosed attached patches whether they are  
for 1.8 or 1.9. The process.c patch appeared to be on the ruby_1_8  
branch, but io.c patch was on head. Could you explain further, or is  
there perhaps a web page that explains the process in more detail?

Many thanks for your response to my bug report - much appreciated,
Jonathan

> Index: process.c
> ===================================================================
> RCS file: /cvs/ruby/src/ruby/process.c,v
> retrieving revision 1.92.2.30
> diff -p -U 2 -r1.92.2.30 process.c
> --- process.c   18 Jul 2006 05:53:33 -0000      1.92.2.30
> +++ process.c   19 Jul 2006 06:32:44 -0000
> Index: io.c
> ===================================================================
> RCS file: /cvs/ruby/src/ruby/io.c,v
> retrieving revision 1.412
> diff -p -u -2 -r1.412 io.c
> --- io.c        3 Jul 2006 01:44:05 -0000       1.412
> +++ io.c        19 Jul 2006 07:11:34 -0000
> @@ -2949,4 +2949,5 @@ popen_exec(void *pp)
>      int fd;
>
> +    rb_thread_atfork();
>      popen_redirect(p);
>      for (fd = 3; fd < NOFILE; fd++) {
> Index: process.c
> ===================================================================
> RCS file: /cvs/ruby/src/ruby/process.c,v
> retrieving revision 1.149
> diff -p -u -2 -r1.149 process.c
> --- process.c   18 Jul 2006 14:55:28 -0000      1.149
> +++ process.c   19 Jul 2006 07:22:40 -0000
>