1

以下にフォークコードを示します。これは、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 で次のように生成されます。 hトップ

私にとって興味深いのは、これが予想のちょうど 2 倍のプロセス数であることです。

なぜこれが起こっているのかについてのヒントはありますか?

興味のある方は、完全なアプリケーションはこちらにあります: https://github.com/Senjai/Learning-Ruby/tree/master/mini-projects/ftp

4

0 に答える 0