找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3776|回复: 4

ACE文件锁问题

[复制链接]
发表于 2007-12-27 23:33:44 | 显示全部楼层 |阅读模式
今天在csdn上看到用这种方法监视程序运行,觉得不错,想改造为ACE的。

发现调用 ACE_OS::fcntl ,flockXXXX的例子很少,不理解,那位朋友有兴趣帮我改改吗?


另:看到论坛上有说给wachterdog,发包来判断是否活的程序的,有例子可以提供吗?谢谢!

下面就举一个文件锁(file lock)的用法,向来不喜欢大段的函数参数格式说明,如果你想详细了解文件锁,请查阅相关文档。

服务器程
序当然不会无缘无故就死掉,除了受到人为攻击的原因,多是程序bug所致,经过长时间(如果允许)测试修正,纠正了大量的bug,服务器程序已经很稳定
了。服务器程序还会崩溃吗?没有人敢说不会,实际就是这样。那好,程序发布的最后阶段就因该是实现服务程序的崩溃自启动。

原理很简单:服务器程序
开始运行时先锁定一个文件,程序正常情况不释放该锁,当程序因故崩溃时Unix系统将自动释放该锁。由此我们可以设计另一个单独的监听程序,它在主程序锁
定锁文件后去锁定同样的文件,那么根据文件锁的性质,此锁定要求将被系统阻塞,当主程序崩溃释放文件锁时,监听程序将获得文件锁,继续执行,在此加入重新
启动主程序的命令即可。

主程序的开始处

        ...
  1. int fd;
  2. fd=open(lockfilename,O_WRONLY|O_CREAT,0600);
  3. flock(fd,LOCK_EX);//互斥锁
  4.        ...
  5. 监听程序的部分内容
  6.       ...
  7. int fd=-1;
  8. fd=open(lockfilename,O_WRONLY|O_RDONLY);
  9. flock(fd,LOCK_EX);//互斥锁
  10. sleep(2);
  11. flock(fd,LOCK_UN);
  12. system(...);//运行主程序
复制代码
 楼主| 发表于 2007-12-27 23:33:56 | 显示全部楼层
虽然我不熟悉linux/unix的做法,但是windows平台上面的做法非常简单,就是启动一个service程序,等待服务器软件的进程句柄,如果有信号,就肯定是崩溃了,重启即可。
但是这个办法也是有缺陷的,比如你的程序没有崩溃,但功能有问题,死锁了,不处理数据了等等,这个是这种办法查不到的,需要有更好的策略。
 楼主| 发表于 2007-12-27 23:34:12 | 显示全部楼层
windows上,我一直是使用定时器不断扫描所有进程,判断是否包含我想要监控的程序,所以认为这个做法很不好,想要修改,请问“ 等待服务器软件的进程句柄,如果有信号” 是什么概念 ?
 楼主| 发表于 2007-12-27 23:34:18 | 显示全部楼层
使用WaitForSingleObject(),一直等待要监视的进程句柄。当这个进程崩溃退出的时候,WaitForSingleObject会返回,你在后面的代码中加入重启动程序的函数就可以了,极其简单可靠,非常方便。
 楼主| 发表于 2007-12-27 23:34:29 | 显示全部楼层
关于内核对象的特性,Windows核心编程有详细的叙述。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-6-1 23:29 , Processed in 0.018695 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表