James Edward Gray II wrote:
> I'm pretty sure we have found a bug in Ruby while working on TextMate.
> 
> This simple script shows the issue with recent versions of Ruby on at 
> least Mac OS X and FreeBSD:
> 
>   #!/usr/bin/env ruby -wKU
> 
>   trap('SIGINT') { warn "#{Time.now} вл receive" }
>   fork           { sleep 0.5
>                    warn "#{Time.now} вл send"
>                    Process.kill('SIGINT', Process.ppid) }
> 
>   %x{true} # comment out this line to eliminate the pause
> 
>   pid = fork { exec('sleep', '4') }
>   Process.wait(pid)
> 
> When this script is run we see a four second delay between the two 
> times. However, you can comment out the %w{true} line and the script 
> then behaves as expected (no delay).
> 
> Using SIGUSR1 instead of SIGINT also resolves the issue.
> 
> The script did work correctly on CentOS with Ruby 1.8.1, so either the 
> change of OS helped or it's a newer bug.
> 
> James Edward Gray II
> 
> 

Some observations:

1. system("")  has the same effect as   %x{true}

2. Having a second thread running eliminates the pause.

3. Reinstalling the INT handler after the system() call eliminates the 
pause.

My test code:

trap('SIGINT') { warn "#{Time.now}  receive" }
fork           { sleep 0.5
                  warn "#{Time.now}  send"
                  Process.kill('SIGINT', Process.ppid) }

#Thread.new {sleep} # comment out this line to eliminate the pause

#trap('SIGINT') { warn "#{Time.now}  receive" }
system "" # comment out this line to eliminate the pause

# reinstalling the INT handler eliminates the pause:
#trap('SIGINT') { warn "#{Time.now}  receive" }

pid = fork { exec('sleep', '4') }
Process.wait(pid)


-- 
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407