Difference between revisions of "Code Snippets"
Jump to navigation
Jump to search
(New page: This page holds random code snippets that do cool things: This snippet creates a subprocess with a bi-directional pipe between them for communication. It can be used for (for example) wra...) |
|||
Line 20: | Line 20: | ||
input.puts 'farewell' | input.puts 'farewell' | ||
end | end | ||
+ | |||
+ | This snippet connects to a UNIX socket on the machine. If the server isn't running; it spawns one in a subprocess and detaches it. This is useful for robustness. | ||
+ | |||
+ | require 'socket'<br/> | ||
+ | PATH=File.join(ENV['HOME'], '.testsock')<br/> | ||
+ | begin | ||
+ | sock = UNIXSocket.new(PATH) | ||
+ | rescue Errno::ENOENT, Errno::ECONNREFUSED => e | ||
+ | File.delete(PATH) if File.socket?(PATH) | ||
+ | if pid = fork() | ||
+ | Process.detach(pid) | ||
+ | sleep 1 | ||
+ | retry | ||
+ | else | ||
+ | server = UNIXServer.new(PATH) | ||
+ | loop do | ||
+ | sock = server.accept | ||
+ | sock.puts("Echo: "+sock.gets) | ||
+ | end | ||
+ | end | ||
+ | end<br/> | ||
+ | sock.puts("HI!") | ||
+ | puts sock.gets |
Revision as of 14:13, 24 September 2007
This page holds random code snippets that do cool things:
This snippet creates a subprocess with a bi-directional pipe between them for communication. It can be used for (for example) wrapping a ssh connection (if you call setsid ssh will use the command defined in SSH_ASKPASS to request the password), daemonizing a process (see also Daemonize) or many other things...
require 'socket'
# create a new stream socket pair in the unix domain input, output = Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM, 0) if pid = fork # forktastic Process.detach(pid) # if we exit, make sure the child doesn't zombie input.puts 'ho' sleep 10 input.puts 'bye' puts output.gets else Process.setsid # make the forked process run in a new session puts output.gets puts output.gets sleep 5 input.puts 'farewell' end
This snippet connects to a UNIX socket on the machine. If the server isn't running; it spawns one in a subprocess and detaches it. This is useful for robustness.
require 'socket'
PATH=File.join(ENV['HOME'], '.testsock')
begin sock = UNIXSocket.new(PATH) rescue Errno::ENOENT, Errno::ECONNREFUSED => e File.delete(PATH) if File.socket?(PATH) if pid = fork() Process.detach(pid) sleep 1 retry else server = UNIXServer.new(PATH) loop do sock = server.accept sock.puts("Echo: "+sock.gets) end end end
sock.puts("HI!") puts sock.gets