2008-09-01 11 views

答えて

1

このプログラムはGoogleのホームページを取得し、ctrl-cでSIG_INTを渡すと、プログラムを再起動し、Googleのオープンソケットからホームページの出力を読み込みます。

#!/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

再起動すると:simple_connector.rb:8:で '初期化 ':不正なファイルディスクリプタsimple_connector.rbから(ERRNO :: EBADF) :8:オープン'で':8: simple_connector.rbからの内'

' – Paul

+0

よりhttp://www.ruby-doc.org/core-2.1.2/IO.html#method-i-close_on_exec-3D Rubyはデフォルトですべてのファイル記述子のclose-on-execフラグを設定しています2.0.0。だから自分で設定する必要はありません。また、close-on-execフラグを解除すると、別のスレッドがfork()やexec()(例えばsystem()メソッド経由)を使用しているとファイル記述子のリークが発生する可能性があります。子プロセスへのファイル記述子の継承が本当に必要な場合は、fd => fdのようなspawn()の引数を使用します。 – ryantm

+0

私がやったことは、あなたの事例を何も変更せずに取ったことです。 close-on-execフラグを適切に処理する方法の例を教えてください。私はexecの前にそれを本当に設定するべきですか? – Paul

0

あなたはUNIXソケットではなくネットワークソケットについて話していますか?

これはあなたのニーズに合っているのかどうかはわかりませんが、ネットワーキングとロジック部分を分離し、ロジック部分を再起動してから、ネットワーキング部分に再接続するだけです。

関連する問題