Skip to content

Instantly share code, notes, and snippets.

View zlx's full-sized avatar

Newell Zhu zlx

  • Hangzhou, China
View GitHub Profile
module NoDoubleRaise
def error_handled!
$! = nil
end
def raise(*args)
if $! && args.first != $!
warn "Double raise at #{caller.first}, aborting"
exit! false
else
t1 = Thread.new do
raise RuntimeError, "oops!" rescue $!
end
t2 = Thread.new do
raise ArgumentError, "doh!" rescue $!
end
puts "main: #{$!.inspect}"
puts "t1: #{t1.value.inspect}"
def tag_errors
yield
rescue Exception => error
error.extend(Lib::Error)
end
@zlx
zlx / fork.rb
Created June 15, 2014 06:17
An fork example
puts "parent process pid is #{Process.pid}"
if fork
puts "entered the if block from #{Process.pid}"
else
puts "entered the else block from #{Process.pid}"
end
fork do
5.times do
sleep 1
puts "I'm an orphan!"
end
end
abort "Parent process died..."
fork do
5.times do
sleep 1
puts "I am an orphan!"
end
end
Process.wait
abort "Parent process died..."
child_processes = 3
dead_processes = 0
# We fork 3 child processes.
child_processes.times do
fork do
# They sleep for 3 seconds.
sleep 3
end
end
puts Process.pid
trap(:INT) { print "Na na na, you can't get me" }
sleep # so that we have time to send it a signal
reader, writer = IO.pipe
fork do
reader.close
10.times do
# heavy lifting
writer.puts "Another one bites the dust"
end
end
writer.close
require 'socket'
child_socket, parent_socket = Socket.pair(:UNIX, :DGRAM, 0)
maxlen = 1000
fork do
parent_socket.close
4.times do
instruction = child_socket.recv(maxlen)
child_socket.send("#{instruction} accomplished!", 0)
end
end