Skip to content

Instantly share code, notes, and snippets.

@pda
Created November 9, 2009 12:46
Show Gist options
  • Save pda/229916 to your computer and use it in GitHub Desktop.
Save pda/229916 to your computer and use it in GitHub Desktop.
#!/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'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment