2008-09-01 8 views

cevap

1

Bu program Google'ın ana sayfasını alır ve ardından SIG_INT aracılığıyla ctrl-c'yi aktardığınızda programı yeniden başlatır ve ana sayfanın çıkışını Google ile açık soketten okur.

#!/usr/bin/ruby 
#simple_connector.rb 
require 'socket' 

puts "Started." 

if ARGV[0] == "restart" 
    sock = IO.open(ARGV[1].to_i) 
    puts sock.read 
    exit 
else 
    sock = TCPSocket.new('google.com', 80) 
    sock.write("GET /\n") 
end 

Signal.trap("INT") do 
    puts "Restarting..." 
    exec("ruby simple_connector.rb restart #{sock.fileno}") 
end 

while true 
    sleep 1 
end 
+0

tekrar çalıştırırken: simple_connector.rb: 8: in 'başlatmak ': Hatalı dosya tanımlayıcısı simple_connector.rb dan (Errno :: EBADF) : 8: Açık' in': 8: simple_connector.rb dan

' – Paul

+0

http://www.ruby-doc.org/core-2.1.2/IO.html#method-i-close_on_exec-3D Ruby, Ruby'den beri varsayılan olarak tüm dosya tanıtıcılarının exec-on bayrakları işaretler. 2.0.0. Yani kendiniz ayarlamanıza gerek yok. Ayrıca, bir exec-on-bayrağı işaretinin iptal edilmesi, başka bir thread fork() ve exec() (örneğin, system() yöntemi aracılığıyla) kullanıyorsa dosya tanımlayıcısının sızdırmasına neden olabilir. Eğer çocuk süreçlerine dosya tanımlayıcısı devralma işlemine gerçekten ihtiyacınız varsa, spawn() argümanını fd => fd gibi kullanın. – ryantm

+0

Ne yaptım - örneğini hiçbir değişiklik yapmadan aldım. Run-close bayrağıyla nasıl başa çıkılacağını örnek verebilir misiniz? Bunu exec'dan önce doğru olarak ayarlamalı mıyım? – Paul

0

Ağ soketleri hakkında konuşuyorsunuz, UNIX soketleri değil mi?

Bunun sizin gereksinimlerinize uygun olduğundan emin değilim, ancak bunu yapmamın yolu, ağ ve mantık bölümünü ayırmak ve yalnızca mantık bölümünü yeniden başlatmak, ardından mantık kısmını ağ kısmına yeniden bağlamaktır.