【发布时间】:2012-10-16 21:26:10
【问题描述】:
我知道当我们派生一个进程时,子进程会继承父进程打开文件描述符和偏移量的副本。根据手册页,这指的是父级使用的相同文件描述符。在以下程序中基于该理论
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) 的情况并非如此,它不会再次在分叉上失去连接。它是否尝试在分叉内部重新连接?
如果是这样,那为什么写文件程序没有报错。
有人能解释一下这里发生了什么吗?谢谢
【问题讨论】:
标签: ruby-on-rails ruby activerecord fork file-descriptor