如何让一个程序只有一个运行实例
来源:互联网 发布:王源同款衣服淘宝 编辑:程序博客网 时间:2024/04/30 16:57
如何让一个程序只有一个运行实例
需求
有的程序我们只希望它只有一个运行实例,也许你现在没有这个需求,说不定哪天就有了。
实现
本来是想通过一个文件来区别,比如进程起来的时候创建一个文件,结束的时候把文件删除,当新的进程起来的时候先判断这个文件是否存在,如果存在就退出;
这个解决方案的特点是简单,但是却有一个致命漏洞,如果这个进程运行的时候异常退出,或者用户在命令行通过kill -9 的方式杀掉的话,那么下次也将无法启动了。
下面是用文件锁的方式来实现:
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char **argv)
{
char *user=getenv("USER");
printf("the user is %s/n",user);
char *home=getenv("HOME");
if(!home){
home="/tmp/";
}
char *name=strcat(home,".mplayer_proc.pid");
printf("the name is %s/n",home);
int fd=open(name,O_RDWR|O_APPEND|O_CREAT,S_IRWXU);
if(fd <0){
perror("openerror/n");
close(fd);
return -1;
}
int val;
if((val = fcntl(fd, F_GETFD, 0) <0 )) {
perror("fcntl");
close(fd);
return -1;
}
val |= FD_CLOEXEC;
if(fcntl(fd, F_SETFD, val) <0 ) {
perror("fcntlagain");
close(fd);
return -1;
}
if(flock(fd,LOCK_EX|LOCK_NB)<0){
perror("flockerror/n");
return -1;
}
sleep(10);
unlink(name);
return 0;
}
这样的话,可以保证在异常退出的时候能够正常运行,也能保证在一个实例运行的时候,另外一个不能运行;
问题
这种实现方式的问题在于,这个文件本身有可能被用户删除,这样的话,就比较麻烦了,目前虽然采用了文件权限来保证,不过还是无法保证root用户来删除,所以这个问题,目前还没有想到好的办法;
- 如何让一个程序只有一个运行实例
- 如何让应用程序只有一个实例运行
- 程序只有一个实例运行
- 让程序只有一个应用程序实例在运行
- 如何让程序只有一个实例运行(用tftp时的感想)?
- 如何让应用程序只有一个实例在运行?
- 如何让应用程序只有一个实例在运行
- 如何让程序只运行一个实例
- 让RCP只有一个实例运行
- 让应用程序只有一个实例运行
- VC怎样让程序只有一个实例
- 如何让Qt应用程序只有一个实例
- 如何让应用程序只有一个实例
- 如何让Qt应用程序只有一个实例
- 确保程序只有一个实例在运行
- 保证程序只有一个运行实例
- 只有一个实例运行
- 只有一个实例运行
- JDBC
- 云计算:21世纪的商业平台
- C语言中最常用标准库函数
- linux下串口编程--2进制读写说明
- 有反向代理(Nginx)时Hessian的411错误解决方案
- 如何让一个程序只有一个运行实例
- lbp-
- .NET页面回退刷新
- 防爆技术在工业电子秤中的最新应用(转)
- DB2 用户管理
- 针对 Java 开发人员的 Dojo 概念
- C++变量命名规范
- 未来五年程序员应当具备的十项技能
- Linux系统UID和GID详解