当前位置:  技术问答>linux和unix

Unix下如何防止程序的二重启动?

    来源: 互联网  发布时间:2015-06-06

    本文导语:  就是同一时间里该程序只能有一份在运行 代码里如何实现? | 用文件锁的方式就可以了。具体的看APUE文件锁的相关部分,里边有实现。 这个问题很多人问过,楼主解决后贴上来提交FAQ吧,造...

就是同一时间里该程序只能有一份在运行
代码里如何实现?

|
用文件锁的方式就可以了。具体的看APUE文件锁的相关部分,里边有实现。
这个问题很多人问过,楼主解决后贴上来提交FAQ吧,造福大家。

|
共享内存吧,初始化一块内存,如果运行作标记

|
共享内存不行,程序异常退出共享内存不会销毁。

|
mutex
lock

|
程序运行的时候记录pid到文件中,程序运行时判断一下指定的进程是否在运行。当然不是很可靠哦。

|
syslogd用的就是文件的方法:
int check_pid (char *pidfile)
{
  int pid = read_pid(pidfile);

  /* Amazing ! _I_ am already holding the pid file... */
  if ((!pid) || (pid == getpid ()))
    return 0;

  /*
   * The 'standard' method of doing this is to try and do a 'fake' kill
   * of the process.  If an ESRCH error is returned the process cannot
   * be found -- GW
   */
  /* But... errno is usually changed only on error.. */
  if (kill(pid, 0) && errno == ESRCH)
  return(0);

  return pid;
}
每次运行把pid记录到一个文件里,下次运行做一次kill(pid,0),看看对应的进程是否还存在。

|
怎么不行,你不对异常退出做处理嘛??那当然不行。我觉得共享内存可以,而且很多人都是这么用的。

|
呵呵,很多人用不表示这就是正确的。如果你的进程被SIGKILL杀掉,就没有办法做处理了。

|
用文件锁既简单又可靠,何乐而不为呢?

|
没明白 为什么共享内存在异常退出的时候不行? 我们用的就是共享内存这个不销毁的机制啊

|
程序启动用文件名做个文件 再启动时检查

|
文件锁在进程退出(不管是正常还是异常)时由内核释放,所以再启动另一个实例时不会有问题。共享内存必须由进程自己释放,如果进程异常退出,共享内存无法释放,下一个实例会认为此时有一个应用实例在运行,因而拒绝执行,此时需要用户干预,手工删除该共享内存。

|
实在不行就玩个土一点的,占一个socket端口作服务器端,占不上就表示已经启动了。
当然,前提得保证没有别的程序占这个端口,咳咳。

|
我的想法是在共享内存中记录自己的进程信息 这样不但可以管理这个程序
而且可以给自己的一系列程序这样做
判断依据是共享内存区是否存在;若存在是否记录了本程序的已启动记录
而且这样还可以做先前程序崩溃后的恢复工作
这样是否可行?

|
好像smwu没理解fierygnu(va_list)说的。。。

这块锁是由内核锁上的,程序在应用层,根本没办法再去对他进行二次操作了啊...而且如果是程序异常退出,很多后面问题根本来不及解决啊,可能发生的问题,谁都不知道。而且这 么恢复工作,在应用层实现是根本不可能的!

|
嗨,同志们,需要这么复杂吗?我的想法是:
(1)程序启动完毕一个固定目录下创建一个标志文件
(2)程序启动时,检查标志文件是否存在,如果存在,表明程序已经启动,退出;不存在,正常启动
(3)程序结束时删除标志文件,当然,程序本身能够捕获并处理各个信号。

这个方法比较简单,但如果用户手工创建/删除标志文件,会使得控制失效。具体该如何实现,应根据具体情况斟酌使用。

|
楼上去仔细看了APUE再来回答吧。

|
to HostOOP(碧云黄花) "(3)程序结束时删除标志文件,当然,程序本身能够捕获并处理各个信号。"
-----------如果程序异常退出,则肯定没有删除标志文件,那么"(2)程序启动时,检查标志文件是否存在,如果存在,表明程序已经启动,退出;不存在,正常启动" 就会出问题拉,

赐教:)

|
"如果程序异常退出,则肯定没有删除标志文件"

程序异常退出前,肯定会发出信号,程序应该有捕获信号的功能,并在退出之前做相应操作。

|
“程序异常退出前,肯定会发出信号”
自己kill -9 pid试试。

|
自己kill -9 pid试试。

===================================
我确实考虑不周到,信号SIGKILL和SIGSTOP不能被忽略,也不能被捕捉

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • SCO UNIX 5.0用软盘启动之后无法启动UNIX
  • 如何同时在启动菜单中启动LINUX和UNIX
  • 我要在一台装window2000的机器下装unix,但用unix光盘启动不了,如何解决?
  • unix .sh文件系统启动时如何实现自动启动
  • 我的SCO UNIX一起动就自动启动x-window(用tty02). 请问如何直接启动到字符界面。
  • unix无法启动了!!!
  • tcp端口被系统(unix stream)占用,本地服务无法正常启动
  • 有谁在Unix上用过RMI么?rmiregistry启动后如何停下来?
  • UNIX下如何添加自启动程序?
  • 寻找高人!如何才能让娇气的UNIX重新启动?
  • 请问如何制作Solaris Unix的安装软盘(用于启动安装)?
  • unix无法启动 在线等高手帮忙
  • 为什么我安装sco openserver unix5.05的时候用光驱不能启动?
  • 不小心把home下的bin文件夹删除了,如何才能启动unix呀?急用
  • 急:unix机器自动重新启动
  • 求救,大家来帮忙(关于SCO UNIX5。05)启动的问题
  • unix如何设置让一个程序自动启动
  • Unix下Apache启动出错,原因如下??
  • 在Unix下怎么做一个系统一启动就加载的程序?
  • 在UNIX/C环境下怎么定时启动一个函数?
  • java命名空间java.util.regex类pattern的类成员方法: unix_lines定义及介绍
  • 刚刚接触Unix系统和Unix编程。急需Unix下多线程程序设计和网络Socket程序设计方面的资料。
  • unix/Linux下c++ boost thread库读写锁介绍
  • 关于UNIX的历史 : 1973年,K.Thompson和D.M.ritchie,用C改写UNIX。那么,在此之前,UNIX是用什么写的?
  • php将标准字符串格式时间转换成unix时间戳_strtotime
  • 没有unix系统我如何学习unix
  • php将unix时间戳转换成字符串时间函数(date)
  • unix盘哪里有下载的??哪里有比较好的unix论坛??万分感谢!!!!!!!!!
  • unix/Linux下c/c++ pthread库读写锁函数介绍
  • 急!装完unix5.06,再装win2000。重启后不能进unix.
  • UNIX特急!!!digital unix问题,请专家快来!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3