免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
1 [报告]
发表于 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
2 [报告]
发表于 2009-02-11 09:57 |显示全部楼层
原帖由 youxiaohe 于 2009-2-10 16:33 发表
可以使用semaphore

这个跟信号量有关吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP