荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店