免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: EastNoFail
打印 上一主题 下一主题

如何禁止一个程序重复运行? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-07-20 16:34 |只看该作者
用信号量其实也可以解决这个问题

论坛徽章:
0
12 [报告]
发表于 2007-07-20 21:30 |只看该作者
写进程号到文件不是可靠的方法,如程序名programa,进程号5555,我可以杀死它后,重启另一个程序(使用同一个文件名programa),尝试多次后使新程序也获得5555进程号(并不需要太多时间,有兴趣的可以试下)。此时真正的programa再运行起来将直接退出。

真正可靠的只有使用信号量/共享内存等系统提供的可靠机制。

论坛徽章:
0
13 [报告]
发表于 2007-07-21 00:54 |只看该作者
原帖由 scutan 于 2007-7-20 11:13 发表


第一种方法是有缺陷,不过在使用第二种方法的时候.
开启一个进程, 在该进程中打开某个配置文件, 进程操作, 然后fork一个子进程, 在该子进程中调用exec()来执行你的程序, 然后父进程就wait(), 一直阻塞在那个 ...

程序要严谨,不能因为几率小就可以容忍,否则大家就不用考虑边界问题了:)

论坛徽章:
0
14 [报告]
发表于 2007-07-21 00:58 |只看该作者
原帖由 scutan 于 2007-7-19 19:03 发表
2. 每次程序启动时都读取一个配置文件, 文件中初始值 ...

文件锁不是那样用的,文件锁的意义在于持有锁的进程结束后,会释放锁的持有权,所以只需要对一个文件加写锁,就能保证后来的进程不能取得写锁的所有权,也就达到了唯一进程的目的了,至于后面的内容加一,就是画蛇添足了...

论坛徽章:
0
15 [报告]
发表于 2007-07-21 01:37 |只看该作者
原帖由 isnowran 于 2007-7-21 00:58 发表

文件锁不是那样用的,文件锁的意义在于持有锁的进程结束后,会释放锁的持有权,所以只需要对一个文件加写锁,就能保证后来的进程不能取得写锁的所有权,也就达到了唯一进程的目的了,至于后面的内容加一,就是 ...


呵呵, 我迷糊了. 竟然忽略了文件锁. 呵呵.
在APUE上面有关于如何防止一个进程同时运行的实例, 具体在APUE2 13.6这个代码中有实现.

论坛徽章:
0
16 [报告]
发表于 2007-07-21 03:32 |只看该作者
原帖由 4tar 于 2007-7-20 21:30 发表
写进程号到文件不是可靠的方法,如程序名programa,进程号5555,我可以杀死它后,重启另一个程序(使用同一个文件名programa),尝试多次后使新程序也获得5555进程号(并不需要太多时间,有兴趣的可以试下)。此 ...


能说说用信号量/共享内存这个方法怎么解决kill -9这种情况吗

论坛徽章:
0
17 [报告]
发表于 2007-07-23 15:03 |只看该作者
建/dev/shm/xxx.pid,再次启动程序时看看xxx是否存在,若不存在,则上次是意味退出,重写xxx.pid并继续程序;若存在,则程序正在运行。

论坛徽章:
0
18 [报告]
发表于 2007-07-23 15:07 |只看该作者
/dev/shm/ 是rom盘,程序死了reboot后就可.

论坛徽章:
0
19 [报告]
发表于 2007-07-23 20:10 |只看该作者
原帖由 wheel 于 2007-7-23 15:07 发表
/dev/shm/ 是rom盘,程序死了reboot后就可.

shm/pid由谁来保证善后?谁规定程序崩溃后就必须reboot?

论坛徽章:
0
20 [报告]
发表于 2007-07-23 21:11 |只看该作者
文件锁


第二种方法,如果程序遭遇到不可预料的退出,比如异常或者被用户强制结束,那么在重新启动操作系统之前就不能再次运行程序了

那还想干什么?

SIGTERM  装着没有收到是 错 的,既然能有权发送信号,那么就是应该结束。想杀死它的人说:小样,我想结束你你还装傻?  后果就是死的更惨了。

楼主理解的有问题

不要担心别人发SIGKILL,担心有什么用呢,捕获SIGTERM就可以了。

对于异常退出的可能,方法应该是检查出程序的错误,为什么会异常结束。
我怕程序有bug,所以如下做,可以参考一下

int main()
while(1) {
    if (fork > 0) {
        wait;
        if child is not killed by signal (exit)
            exit
    }
    else break;
}
//child
signal(SIGTERM,gotsig);

gotsig()
{
    ....
    exit
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP