当前位置: 技术问答>linux和unix
求助:如何禁止程序重复运行?
来源: 互联网 发布时间:2016-02-06
本文导语: 也就是启动一个程序后, 再启动时能检测到已经存在的程序,并退出?请提供参考代码 | /*------------------------------------------------------------------------ * 文件说明: * 文件名 - lock.c * * ...
也就是启动一个程序后, 再启动时能检测到已经存在的程序,并退出?请提供参考代码
|
/*------------------------------------------------------------------------
* 文件说明:
* 文件名 - lock.c
*
* 函数列表:
* iamrunning - 判断我是不是正在运行
* delpidfile - 删去我的pid文件
*-----------------------------------------------------------------------*/
/*------------------------------------------------------------------------
*
* man
*
*-----------------------------------------------------------------------*/
#include "../lock/lock.h"
/* 把宏定义写在这里。*/
#ifdef __cplusplus
extern "C" {
#endif
/*--------------------------------------------------------------------------*
* static const char *filename = "/var/run/wedskq42.pid";
* 文件名
*--------------------------------------------------------------------------*/
static const char *filename = "/var/run/wedskq42.pid";
static void cool_exit(void) __attribute__ ((constructor));
/* 把本文件中出现的函数的原型(如果需要)写在这里。*/
#ifdef __cplusplus
}
#endif
/*--------------------------------------------------------------------------*
函数名字 iamrunning - 判断我是不是正在运行
函数原型 int iamrunning(void)
函数所在头文件 lock.h
函数的详细描述 判断我是不是正在运行
函数返回值 如果我在运行,返回我的 pid; 出错或没有运行, 返回 -1
*--------------------------------------------------------------------------*/
int iamrunning(void) {
FILE *fp;
if(file_exist((char *)filename)) {
pid_t pid;
if((fp = fopen(filename, "rt")) == NULL) {
perror(filename);
return -1;
}
if(fscanf(fp, "%d", &pid) != 1) {
perror("fscanf");
fclose(fp);
return -1;
}
fclose(fp);
if(kill(pid, 0) == 0)
return pid;
}
if((fp = fopen(filename, "wt")) == NULL) {
perror("fopen");
return -1;
}
if(fprintf(fp, "%dn", (int)getpid()) = 0) {
printf("系统已经运行, 进程 ID 是 %ldn", (long int)pid);
exit(1);
}
* 文件说明:
* 文件名 - lock.c
*
* 函数列表:
* iamrunning - 判断我是不是正在运行
* delpidfile - 删去我的pid文件
*-----------------------------------------------------------------------*/
/*------------------------------------------------------------------------
*
* man
*
*-----------------------------------------------------------------------*/
#include "../lock/lock.h"
/* 把宏定义写在这里。*/
#ifdef __cplusplus
extern "C" {
#endif
/*--------------------------------------------------------------------------*
* static const char *filename = "/var/run/wedskq42.pid";
* 文件名
*--------------------------------------------------------------------------*/
static const char *filename = "/var/run/wedskq42.pid";
static void cool_exit(void) __attribute__ ((constructor));
/* 把本文件中出现的函数的原型(如果需要)写在这里。*/
#ifdef __cplusplus
}
#endif
/*--------------------------------------------------------------------------*
函数名字 iamrunning - 判断我是不是正在运行
函数原型 int iamrunning(void)
函数所在头文件 lock.h
函数的详细描述 判断我是不是正在运行
函数返回值 如果我在运行,返回我的 pid; 出错或没有运行, 返回 -1
*--------------------------------------------------------------------------*/
int iamrunning(void) {
FILE *fp;
if(file_exist((char *)filename)) {
pid_t pid;
if((fp = fopen(filename, "rt")) == NULL) {
perror(filename);
return -1;
}
if(fscanf(fp, "%d", &pid) != 1) {
perror("fscanf");
fclose(fp);
return -1;
}
fclose(fp);
if(kill(pid, 0) == 0)
return pid;
}
if((fp = fopen(filename, "wt")) == NULL) {
perror("fopen");
return -1;
}
if(fprintf(fp, "%dn", (int)getpid()) = 0) {
printf("系统已经运行, 进程 ID 是 %ldn", (long int)pid);
exit(1);
}
|
启动程序
检查文件/var/run/progname.pid文件是否存在,如果存在,把内容读出来,
pid = readfile(/var/run/progname.pid);
if (kill(pid, SIGTERM) >= 0) {
alarm(0);
// 确保已经运行的程序退出
do {
sleep(1);
continue;
} while (kill(pid, 0) >= 0);
}
调用getpid(),把pid写到一个文件/var/run/progname.pid里去
检查文件/var/run/progname.pid文件是否存在,如果存在,把内容读出来,
pid = readfile(/var/run/progname.pid);
if (kill(pid, SIGTERM) >= 0) {
alarm(0);
// 确保已经运行的程序退出
do {
sleep(1);
continue;
} while (kill(pid, 0) >= 0);
}
调用getpid(),把pid写到一个文件/var/run/progname.pid里去