A
ara.t.howard
cfp:~ > cat a.rb
#
# on windows signals don't work. least wise you cannot send, for
instance,
# SIGABRT to another process. rather, you can only signal yourself!
to get
# around this limitation a tiny drb service, fronting the Process object
# itself, can be setup to allow one process to signal another by
making a drb
# call that actually causes the other process to signal *itself*.
you've
# really got to love ruby at times like these.
#
require 'drb'
mode = ARGV.shift || 'servant'
uri = ARGV.shift
signal = 'ABRT'
start_server = lambda do
trap(signal){ puts "#{ Process.pid } got #{ signal }..." }
DRb.start_service 'druby://localhost:0', Process
uri = DRb.uri
end
start_client = lambda do
DRb.start_service 'druby://localhost:0'
process = DRbObject.new nil, uri
end
case mode
when /server/i
puts "server.pid => #{ Process.pid }."
uri = start_server.call
puts DRb.uri
loop do
puts "not blocking..."
sleep 1
end
when /client/i
puts "client.pid => #{ Process.pid }."
process = start_client.call
process.kill signal, process.pid
when /servant/i
puts "server.pid => #{ Process.pid }."
uri = start_server.call
Thread.new do
loop do
puts "not blocking..."
sleep 1
end
end
program = __FILE__
client_program = "ruby #{ program } client #{ uri }"
4.times do
system client_program
sleep 1
end
end
cfp:~ > ruby a.rb
server.pid => 1593.
not blocking...
client.pid => 1594.
1593 got ABRT...
not blocking...
client.pid => 1595.
1593 got ABRT...
not blocking...
client.pid => 1596.
1593 got ABRT...
not blocking...
client.pid => 1597.
1593 got ABRT...
not blocking...
a @ http://codeforpeople.com/
#
# on windows signals don't work. least wise you cannot send, for
instance,
# SIGABRT to another process. rather, you can only signal yourself!
to get
# around this limitation a tiny drb service, fronting the Process object
# itself, can be setup to allow one process to signal another by
making a drb
# call that actually causes the other process to signal *itself*.
you've
# really got to love ruby at times like these.
#
require 'drb'
mode = ARGV.shift || 'servant'
uri = ARGV.shift
signal = 'ABRT'
start_server = lambda do
trap(signal){ puts "#{ Process.pid } got #{ signal }..." }
DRb.start_service 'druby://localhost:0', Process
uri = DRb.uri
end
start_client = lambda do
DRb.start_service 'druby://localhost:0'
process = DRbObject.new nil, uri
end
case mode
when /server/i
puts "server.pid => #{ Process.pid }."
uri = start_server.call
puts DRb.uri
loop do
puts "not blocking..."
sleep 1
end
when /client/i
puts "client.pid => #{ Process.pid }."
process = start_client.call
process.kill signal, process.pid
when /servant/i
puts "server.pid => #{ Process.pid }."
uri = start_server.call
Thread.new do
loop do
puts "not blocking..."
sleep 1
end
end
program = __FILE__
client_program = "ruby #{ program } client #{ uri }"
4.times do
system client_program
sleep 1
end
end
cfp:~ > ruby a.rb
server.pid => 1593.
not blocking...
client.pid => 1594.
1593 got ABRT...
not blocking...
client.pid => 1595.
1593 got ABRT...
not blocking...
client.pid => 1596.
1593 got ABRT...
not blocking...
client.pid => 1597.
1593 got ABRT...
not blocking...
a @ http://codeforpeople.com/