Bug #13916
closedRace condition when sending a signal to a new fork
Description
To reproduce, run this script:
1_000_000.times do |i|
  pid = fork {sleep}
  puts pid
  Process.kill(:TERM, pid)
  Process.wait(pid)
end
Expected behavior: it should print a million pids and then exit.
Actual behavior: after some number of iterations, it freezes on the call to Process.wait, because the fork never got killed by the TERM signal. (I verified with ps that the pid it froze on is still running.)
        
          
          Updated by normalperson (Eric Wong) about 8 years ago
          
          
        
        
      
      russell.davis@gmail.com wrote:
Oops, I don't think we block signals properly for plain fork' (vs spawn').
We need to use pthread_sigmask / sigprocmask to block signal.
I am testing this (slowly) and going to take a break while it
runs:
https://80x24.org/spew/20170919223250.22840-1-e@80x24.org/raw
        
          
          Updated by Anonymous about 8 years ago
          
          
        
        
      
      - Status changed from Open to Closed
 
Applied in changeset trunk|r59975.
process: block/unblock signals around fork
As with forking for execve(2) in spawn', we must block signals to ensure they are handled correctly in a freshly fork'-ed child.
- 
process.c (retry_fork_ruby): block/unblock signals around fork
(rb_fork_ruby): re-enable signals in forked child - 
test/ruby/test_process.rb (test_forked_child_signal): new test
[ruby-core:82883] [Bug #13916]Thanks to Russell Davis for the bug report and test case.
 
        
          
          Updated by normalperson (Eric Wong) about 8 years ago
          
          
        
        
      
      Eric Wong normalperson@yhbt.net wrote:
russell.davis@gmail.com wrote:
https://bugs.ruby-lang.org/issues/13916
https://80x24.org/spew/20170919223250.22840-1-e@80x24.org/raw
Cleaned up and added test, committed as r59975
        
          
          Updated by normalperson (Eric Wong) about 8 years ago
          
          
        
        
      
      - Status changed from Closed to Open
 - Backport changed from 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN to 2.2: REQUIRED, 2.3: REQUIRED, 2.4: REQUIRED
 
backport status change
        
          
          Updated by normalperson (Eric Wong) about 8 years ago
          
          
        
        
      
      - Status changed from Open to Closed
 
closing to trigger backport of r59975
        
          
          Updated by nagachika (Tomoyuki Chikanaga) over 7 years ago
          
          
        
        
      
      - Backport changed from 2.2: REQUIRED, 2.3: REQUIRED, 2.4: REQUIRED to 2.2: REQUIRED, 2.3: REQUIRED, 2.4: DONE
 
ruby_2_4 r62665 merged revision(s) 59975.
        
          
          Updated by usa (Usaku NAKAMURA) over 7 years ago
          
          
        
        
      
      - Backport changed from 2.2: REQUIRED, 2.3: REQUIRED, 2.4: DONE to 2.2: REQUIRED, 2.3: DONE, 2.4: DONE
 
ruby_2_3 r62816 merged revision(s) 59975.