荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: BAX.bbs@bbs.csu.edu.cn (都是夜归人), 信区: InstallBBS
标  题: 协调signal和lock之间的关系
发信站: 云麓园 (Wed Sep 25 17:23:33 2002)
转信站: SZUBBS!news2.happynet.org!CSUBBS

标  题: 协调signal和lock之间的关系
发信站: 南京大学小百合站 (Wed Sep 25 14:31:52 2002), 站内信件


如果程序在lock中遇到了signal,容易出现一些问题甚至发生系统崩溃(当然几
率很低). 简单的处理方法是lock时屏蔽signal, 但这可能造成丢失讯息等负作
用.压制signal的方法效果会更好一些. 主要想法是收到signal时检查进程是否
处在某个flock之中。如果是则这个signal被压制,待到unlock时再检查是否有
被压制的signal,  如有则重新发送该signal. 这个方法在程序上实现比较简单
, 只需包装lock和unlock, 此然后每个signal处理函数前面都加一句判断:

if(sig_in_lock(signum)) return;


lock函数的代码:

static int in_lock;
static int sp_signal;

int do_lock(chr *file) {
    int fd;
    fd=open(file, O_RDONLY|O_CREAT, 0660);
    if(fd>=0) {
        flock(fd, LOCK_EX);
        in_lock=1;
    }
    return fd;
}

int do_unlock(int lock) {
    if(lock<0) return 0;
    flock(lock, LOCK_UN);
    close(lock);
    in_lock=0;
    check_sp_signal();
}

int sig_in_lock(int sig) {
    if(in_lock) {
        sp_signal=sig;
        return 1;
    }
    return 0;
}

int check_sp_signal() {
    if(!sp_signal) return;
    kill(getpid(), sp_signal);
    sp_signal=0;
}

主程序中设置:

设置sig_handler

void onmsg(int);
signal(SIGUSR1, onmsg);
...

处理函数:
void onmsg(int signum) {
    if(sig_in_lock(signum)) return;
    ....
}

这里只暂存了一个signal, 如果要严格一些可以用一个数组来暂存多个signal.


--

--



There is always more then one way to do it,right


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店