Chinaunix首页 | 论坛 | 博客
  • 博客访问: 905465
  • 博文数量: 201
  • 博客积分: 8078
  • 博客等级: 中将
  • 技术积分: 2162
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-20 17:22
文章分类

全部博文(201)

文章存档

2013年(3)

2012年(11)

2011年(34)

2010年(25)

2009年(51)

2008年(77)

分类:

2008-08-05 14:42:08

有时候需要跟shell提供一把锁来实现多个相关shell进程间的同步。下面例子也许就是你想要的, 未经严格测试, 如果有什么bug. 别找我呀。


#!/bin/sh


function lock
{
    while ! mkdir $1 2> /dev/null;
    do
        dd bs=1 count=1 <& 3 > /dev/null 2>/dev/null;
    done;
}

function unlock
{
    if ! rmdir $1;
    then
        echo "bad call unlock";
    fi;
    dd bs=1 count=1 >& 4 < /dev/zero 2>/dev/null;
}

function gotter
{
    let use_idx=0;
    exec 3<_sleep;
    exec 4>_wakeup;
    lock _lock;
    export use_idx=`cat _refcount`;
    while [ $use_idx -lt 1000 ];
    do
        echo $(($use_idx+1)) > _refcount;
        unlock _lock;
        echo $1.lock $use_idx;
    sleep 1;
           lock _lock;
           export use_idx=`cat _refcount`;
    done;
    rmdir $1.lock;
    unlock _lock;
    exec 4>&-;
    exec 3<&-;
    echo $1.lock is finish
}

rm -f _lock;
echo 0 > _refcount;
mkfifo _wakeup _sleep;

for i in a b c d e f;
do
    mkdir $i.lock;
    (gotter $i &);
done;

exec 3>_sleep;
exec 4<_wakeup;

for i in a b c d e f;
do
    while [ -d $i.lock ];
    do
        dd bs=1 count=1 >&3 <&4 2>/dev/null;
    done;
done;

exec 4<&-
exec 3<&-

rm _sleep _wakeup;

阅读(1890) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~