Difference between revisions of "Code Snippets"

From WTFwiki
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 15: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