A simple inter-process lock

Linux程序员通常喜欢用文件锁来做进程间的同步,或简单地用文件锁指示程序进程是否还健在。在ruby里面可以很简单的实现文件锁:
[code]
=begin
file lock for inter-process sync.
usage:
FSLock('mylock') do
# protected by lock,
# do your job here ...
end
=end
class FSLock
def initialize(name=nil)
name ||= 'global'
@fname = name + '.lock'
if block_given?
lock()
yield
unlock()
end
end

def critical
lock()
yield() if block_given?
unlock()
end

def lock
@f = File.new(@fname, "ab")
@f.flock(File::LOCK_EX) if @f
end

def unlock
@f.close if @f
end
end
[/code]

测试代码:
[code]
if $0 == __FILE__
unless fork
# child process
3.times do |i|
FSLock.new('/tmp/myapp') do
sleep 2 # child process sleep while holding the lock
puts "#{Time.now.to_s}: Ping !"
end
end
else
# parent process
sleep 0.1
6.times do
FSLock.new('/tmp/myapp') do # parent process will be blocked while child holding the lock
puts "#{Time.now.to_s}: Pong !"
end
sleep 0.1
end
Process.wait
end
end
[/code]

父子进程通过文件锁来同步,子进程持有锁后休眠2秒导致父进程企图获取锁时休眠。最后子进程不在持有锁的时候,父进程不再block。

Win32用户可以在Cygwin下运行此代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值