6

プロセスをフォークすると、子プロセスが親の開いているファイル記述子とオフセットのコピーを継承することを理解しています。マニュアルページによると、これは親が使用するのと同じファイル記述子を指します。次のプログラムのその理論に基づいています


puts "Process #{Process.pid}"

file = File.open('sample', 'w')

forked_pid = fork do
    sleep(10)
    puts "Writing to file now..."
    file.puts("Hello World. #{Time.now}")       
end




file.puts("Welcome to winter of my discontent #{Time.now}")
file.close
file = nil

質問 1:10秒間スリープしているフォークされたプロセスは、ファイル記述子を失い、親プロセスが完了してファイルを閉じて終了するときにファイルに書き込めないようにする必要があります。
質問2:しかし、何らかの理由でこれが機能する場合、このシナリオでActiveRecordはどのように接続を失いますか。ActiveRecord接続を設定した場合にのみ機能:reconnect => trueします。実際に接続できます。つまり、接続が失われます。


require "rubygems"
require "redis"
require 'active_record'
require 'mysql2'

connection = ActiveRecord::Base.establish_connection({
    :adapter => 'mysql2',
    :username => 'root_user',
    :password => 'Pi',
    :host => 'localhost',
    :database => 'list_development', 
    :socket => '/var/lib/mysql/mysql.sock'

    })

class User < ActiveRecord::Base   
end

u = User.first

puts u.inspect

fork do
    sleep 3
    puts "*" * 50
    puts User.first.inspect
    puts "*" * 50

end

puts User.first.inspect

ただし、フォークでの接続が失われないRedis(v2.4.8)でも同じことは当てはまりません。フォークで内部的に再接続しようとしますか?

その場合、ファイル書き込みプログラムがエラーをスローしないのはなぜですか。

誰かがここで何が起こっているのか説明してもらえますか?ありがとう

4

1 に答える 1