免费注册 查看新帖 |

Chinaunix

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

Unix下有什么方法实现防止程序多重执行? [复制链接]

论坛徽章:
0
51 [报告]
发表于 2009-02-09 23:37 |只看该作者
直接判断命令行参数不行吗?

论坛徽章:
0
52 [报告]
发表于 2009-02-10 09:34 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
53 [报告]
发表于 2009-02-10 14:10 |只看该作者

回复 #41 leshy 的帖子

在pcwkt兄的代码基础上修改了一下,贴出来,测试过,可用


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <signal.h>
  7. char *filename = "/tmp/tmp_proc";


  8. pid_t check_proc_use_file(char *filename)
  9. {
  10.     FILE *fp = NULL;
  11.     pid_t pid = 0;

  12.     if(access(filename,F_OK) != 0)
  13.      {
  14.              fp = fopen(filename,"w");
  15.         fprintf(fp,"%d\n",getpid());
  16.      }
  17.     else
  18.      {
  19.              fp = fopen(filename,"r+");
  20.         fscanf(fp,"%d",&pid);
  21.        if(!(pid > 0 &&  kill(pid,0) == 0))
  22.         {
  23.                 ///proc exist
  24.              fseek(fp, 0L, SEEK_SET); //²»´æÔÚ
  25.             fprintf(fp,"%d\n",getpid());
  26.             pid = 0;
  27.         }
  28.      }
  29.     fclose(fp);
  30.     return pid;
  31. }

  32. void sig_handler_term(int sig)
  33. {
  34.     printf("killed by kill cmd etc\n");
  35.    unlink(filename);
  36.     exit(0);
  37. }

  38. void sig_handler_int(int sig)
  39. {
  40.     printf("killed by kill ctrl+c etcs\n");
  41.     unlink(filename);
  42.     exit(0);
  43. }


  44. int main(int argc,char **argv)
  45. {
  46.         pid_t p_id,status;

  47.         FILE *fp = NULL;

  48.         signal(SIGTERM,sig_handler_term);
  49.         signal(SIGINT,sig_handler_int);
  50.         if(argc !=2)
  51.         {
  52.                 printf("pls use like 'proc start' or 'proc stop'\n");
  53.                 exit(0);
  54.         }
  55.         if(strncasecmp(argv[1],"start",5) == 0)
  56.         {
  57.                 //start proc
  58.                 status = check_proc_use_file(filename);
  59.                 if(status >0)
  60.                 {
  61.                         printf("%d already exist\n",status);
  62.                         exit(2);
  63.                 }
  64.                 while(1)
  65.             ;
  66.         }
  67.         else if(strncasecmp(argv[1],"stop",4) == 0)
  68.         {
  69.                 //stop proc
  70.                 fp = fopen(filename,"r");
  71.         fscanf(fp,"%d",&p_id);
  72.         kill(p_id,SIGKILL);
  73.                 unlink(filename);
  74.         }
  75.         else
  76.         {
  77.                 printf("param error,pls use start or stop\n");
  78.                 exit(0);
  79.         }
  80.     return 0;
  81. }
复制代码

论坛徽章:
0
54 [报告]
发表于 2009-02-10 14:53 |只看该作者
给你个提示,一个网络游戏,同一台电脑可以开几个号

论坛徽章:
0
55 [报告]
发表于 2009-02-10 16:33 |只看该作者
可以使用semaphore

论坛徽章:
0
56 [报告]
发表于 2009-02-10 17:23 |只看该作者
Always start from script
when starting this application, use "ps -ef|grep "XXX"", can check the returns.
Why must checking this in code?

论坛徽章:
0
57 [报告]
发表于 2009-02-11 09:35 |只看该作者
原帖由 liveforlove 于 2009-2-10 17:23 发表
Always start from script
when starting this application, use "ps -ef|grep "XXX"", can check the returns.
Why must checking this in code?

拜托用中文好不好?三句话,三个语法错。

论坛徽章:
0
58 [报告]
发表于 2009-02-11 09:45 |只看该作者
原帖由 Aquester 于 2009-2-9 23:37 发表
直接判断命令行参数不行吗?

WINDOWS是可以的,LINUX应该也可以,不过我不会。。。。

论坛徽章:
0
59 [报告]
发表于 2009-02-11 09:57 |只看该作者
原帖由 youxiaohe 于 2009-2-10 16:33 发表
可以使用semaphore

这个跟信号量有关吗?

论坛徽章:
0
60 [报告]
发表于 2009-02-12 13:51 |只看该作者

可以使用脚本先检查当前是否已有要启动的程序的进程 grep

可以使用脚本先检查当前是否已有要启动的程序的进程 grep
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP