Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env ruby
- # Contrived example of self-pipe preventing signal race condition prior to select()
- # @see http://cr.yp.to/docs/selfpipe.html
- # @author Paul Annesley
- SELF_READ, SELF_WRITE = IO.pipe
- @run = true
- trap :INT do
- @run = false
- SELF_WRITE.putc(0)
- end
- # send SIGINT mid-sleep
- Process.fork { sleep 1; Process.kill :INT, Process.ppid; exit }
- r,w = IO.pipe
- while @run do
- sleep 0.2 # .. amplify race-condition; exists until select()
- w.putc(".") if @run # .. nothing written if SIGINT handler has disabled @run
- selected = IO.select [r, SELF_READ]
- break if selected.first.include? SELF_READ
- print r.getc
- end
- puts 'without self-pipe, select() would have blocked'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement