プロセスをフォークすると、子プロセスが親の開いているファイル記述子とオフセットのコピーを継承することを理解しています。マニュアルページによると、これは親が使用するのと同じファイル記述子を指します。次のプログラムのその理論に基づいています
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)でも同じことは当てはまりません。フォークで内部的に再接続しようとしますか?
その場合、ファイル書き込みプログラムがエラーをスローしないのはなぜですか。
誰かがここで何が起こっているのか説明してもらえますか?ありがとう