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

编程时,如何保证一个进程只运行一次?

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

    本文导语:  即,程序A运行时,此时不能再运行它。谢。 | 这个方法还是比较多的。 1、用共享内存标志或其他进程间标志做为判断是否运行的标准,这种方式得在程序正常退出时关掉系统的标志。 2、把...

即,程序A运行时,此时不能再运行它。谢。

|
这个方法还是比较多的。
1、用共享内存标志或其他进程间标志做为判断是否运行的标准,这种方式得在程序正常退出时关掉系统的标志。
2、把程序的PID值写到一个文件中,下次启动的时候做判断即可。
int write_flag(const char path[128]){
 if( (fd = creat(path,00666)) == -1) {
   perror("create pid file error!");
 exit(1);
 }
 if( write( fd,&pid,sizeof(pid) ) != sizeof(pid) ) {
 perror("write pid file error!");
 close(fd);
 exit(1);
 return 0;
}

int already_run_teller(const char pidfile_pathname[128])
{
        if((fd = open(pidfile_pathname, O_RDONLY | O_CREAT)) == -1) {
                return -1;
        }
        if( (flag = read( fd, &pid, sizeof(pid) )) != sizeof(pid)) {
                close(fd);
          return -1;
        }
}

你的修改以下才可以用。以上只是大体思路

|
用文件上锁的方式是可以的,因为如果程序结束(包括非正常结束)也会自动释放锁(因为对文件的管理是由内核来维护的)
如果用程序名称来判断是否只有一个进程存在的话,就有一个很大的问题,就是如果人家把程序名字改了后再运行,这招就不管用了

|
简单的考虑使用:
 cristy_cn() 说的“ps -aef|grep name 查看进程”的方法就可以,但是不能防止人们改名后启动。

复杂一些,可以这样建立一个小的共享内存标志区,存放进程的PID,启动程序先判断内存标志,如果为空,则正常启动;如果不为空,则使用“ps -aef|grep name ”察看对应的PID的进程是否存在,如果存在,则说明“已经启动”,马上退出。如果PID对应的进程不存在,说明程序已经异常退出,可以启动。

我感觉这样全面一些,你可以试一下。

|
文件上锁的方式

|
APUE第12章record locking有一段代码就是如何让一个daemon只有一份拷贝运行,使用的是文件锁,可供你参考。

|
楼上的方法很好,前面那些锁来锁去的,进程非正常结束锁就不管用了,内核中的信息才是最可靠的。

|
建立文件锁。比如firefox的:
$ls -l ~/.mozilla/firefox/32obiq6i.default/lock
lrwxrwxrwx  1 hellwolf users 19 Aug 19 10:24 /home/hellwolf/.mozilla/firefox/32obiq6i.default/lock -> 192.168.128.2:19988

但是,这样有个不好的地方,如果firefox恰好非正常退出的话,下次启动就会因为
锁文件没有删除而出错。只能手动删除改文件

    
 
 

您可能感兴趣的文章:

  • 如何AIX UNIX 主机在进程中通过C编程获取进程名
  • 请教如何编程实现父进程产生多个子进程
  • 在进行多进程编程时,怎样才能知道系统管理员一共允许我同时起几个进程?
  • 哪位编程高手知道如何编程实现获取进程的内存使用量信息(linux)
  • help help busy!!! 请问如何让一个进程进入dead状态或者编程实现让一个进程进入dead状态
  • 请教一个多进程编程问题
  • 编程模拟多进程共享临界资源
  • 多进程编程问题
  • 多进程socket编程问题
  • 请介绍两本LINUX下关于多进程,网络编程的书籍
  • 多进程编程的小问题
  • 怎么编程测试进程创建、进程切换、进程结束的时间开销?
  • 多进程编程中,可否共享数据对象?
  • Linux多进程多线程编程
  • Linux下的多进程编程
  • 内核模块编程打印进程信息
  • 求助:在什么情况下需要用到进程编程?谢谢!
  • linux多进程编程问题
  • Linux编程的"进程挂靠"是什么意思?
  • 请各位帮忙推荐几本Linux多进程编程的好书
  • unix编程,两条语句,有方法可以保证是原子操作吗
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 即时运行的编程语言 Circa
  • 运行<<UNIX网络编程卷一>>中程序的错误?
  • 请问谁运行过《Java XML 编程指南》中的代码?
  • 有没有提高java运行效率的方法,工具或是编程的技巧!
  • 有关后台运行的编程问题
  • 如何编程 获取一个用户进程的运行状况?
  • 请问:网络编程里服务器端程序,运行后就会有Address already in use,该怎么办啊
  • 送分! UNIX C编程。 程序中如何获得当前运行目录? .
  • 菜鸟问题,小弟刚刚使用LINUX不久,不知道如何使用编程工具进行编译和运行!
  • Java有没有运行速度快的IDE编程环境?
  • 请问我要在手机上或pda上做彩色的游戏,需要哪些方面支持彩色。比如机器本身?运行环境(KVM)?编程工具(J2ME)?
  • 寻求unix下 c++ 编程 编译、连接、运行错误提示信息的详细参考资料
  • linux下C编程时标准的运行库在那里找?难道要把TURBO C的靠过来用
  • c语言编程问题:如果防止linux下程序的重复运行?
  • *****《unix环境高级编程》里的代码是否不用修改就可以在linux上运行?
  • 关于《Unix网络编程》在ubuntu 8.04下运行的问题,服务器端阻塞在accept调用,客户端阻塞在connect调用,导致连接失败
  • 如何用编程的方法知道一个应用程序是否在运行
  • 运行unix环境高级编程例子问题
  • 怎么样在Linux编程中查看某个指定的程序是否在运行?
  • 帮帮小女子吧T_T 一个编程作业--如何创建几个子进程让他们同时运行??
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • 都说《UNIX环境高级编程》好,对于学linux编程好不好?《Linux下的c编程》《嵌入式系统C编程》那个更适合初学者?各是那个出版社的?(
  • 2013年7月和2013年8月编程语言排行榜
  • daemon 是属于 用户态编程 还是 内核态编程? 关于内核编程的书/资料介绍些好吗?
  • 苹果OS X和IOS下最新编程语言swift介绍
  • 请教linux下的编程的选择:我听说有gtk+gnome的编程,也有kde里的 什么编程,到底应该选择哪个呢?好象一个是技术好一点,一个是市场占有
  • 学不好编程的三个原因
  • 傻瓜问题,请问shell编程和shell脚本编程的关系
  • 半路出家转行学编程如何才能成为大牛?
  • unix编程与linux编程有什么区别?
  • 2017 年热门编程语言排行榜出炉,你的语言上榜没?


  • 站内导航:


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

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

    浙ICP备11055608号-3