日期:2014-05-16  浏览次数:20580 次

求助:如何禁止程序重复运行?
也就是启动一个程序后,   再启动时能检测到已经存在的程序,并退出?请提供参考代码

------解决方案--------------------
/*------------------------------------
* 文件说明:
* 文件名 - 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, "%d\n ", (int)getpid()) < 0)
perror( "fprintf ");
fclose(fp);
return -1;
} /* iamrunning */

/*--------------------------------------*
函数名字 delpidfile - 删去我的pid文件
函数原型 void delpidfile(void)
函数所在头文件 lock.h
函数的详细描述 删去我的pid文件
函数返回值 无
*--------------------------------------*/
void delpidfile(void) {

remove(filename);
} /* delpidfile */

static void cool_exit(void) {

pid_t pid;

if((pid = iamrunning()) > = 0) {
printf( "系统已经运行, 进程 ID 是 %ld\n ", (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里去