以下にフォークコードを示します。これは、TCP と FTP をいじるだけの非常に最小限のアプリケーションです。
require 'socket'
require_relative '../lib/ftp/common'
module FTP
class Preforking
include Common
CONCURRENCY = 4
def run
child_pids = []
CONCURRENCY.times do
child_pids << spawn_child
end
trap(:INT) {
child_pids.each do |c|
begin
Process.kill(:INT, c)
rescue Errno::ESRCH
end
end
exit
}
loop do
pid = Process.wait
$stderr.puts "Process #{pid} quit unexpectedly"
child_pids.delete(pid)
child_pids << spawn_child
end
end
def spawn_child
fork do
loop do
@client = @control_socket.accept
respond "220 OHAI"
handler = CommandHandler.new(self)
loop do
request = @client.gets(CRLF)
if request
respond(handler.handle(request))
else
@client.close
break
end
end
end
end
end
end
end
FTP::Preforking::CONCURRENCY の値のため、合計 5 つのプロセスが必要になると思います。メインプロセスと 4 つの子プロセス。
run を呼び出してアプリケーションを実行すると、htop で次のように生成されます。
私にとって興味深いのは、これが予想のちょうど 2 倍のプロセス数であることです。
なぜこれが起こっているのかについてのヒントはありますか?
興味のある方は、完全なアプリケーションはこちらにあります: https://github.com/Senjai/Learning-Ruby/tree/master/mini-projects/ftp