当前位置: 技术问答>linux和unix
编程时,如何保证一个进程只运行一次?
来源: 互联网 发布时间:2015-10-14
本文导语: 即,程序A运行时,此时不能再运行它。谢。 | 这个方法还是比较多的。 1、用共享内存标志或其他进程间标志做为判断是否运行的标准,这种方式得在程序正常退出时关掉系统的标志。 2、把...
即,程序A运行时,此时不能再运行它。谢。
|
这个方法还是比较多的。
1、用共享内存标志或其他进程间标志做为判断是否运行的标准,这种方式得在程序正常退出时关掉系统的标志。
2、把程序的PID值写到一个文件中,下次启动的时候做判断即可。
int write_flag(const char path[128]){
if( (fd = creat(path,00666)) == -1) {
perror("create pid file error!");
exit(1);
}
if( write( fd,&pid,sizeof(pid) ) != sizeof(pid) ) {
perror("write pid file error!");
close(fd);
exit(1);
return 0;
}
int already_run_teller(const char pidfile_pathname[128])
{
if((fd = open(pidfile_pathname, O_RDONLY | O_CREAT)) == -1) {
return -1;
}
if( (flag = read( fd, &pid, sizeof(pid) )) != sizeof(pid)) {
close(fd);
return -1;
}
}
你的修改以下才可以用。以上只是大体思路
1、用共享内存标志或其他进程间标志做为判断是否运行的标准,这种方式得在程序正常退出时关掉系统的标志。
2、把程序的PID值写到一个文件中,下次启动的时候做判断即可。
int write_flag(const char path[128]){
if( (fd = creat(path,00666)) == -1) {
perror("create pid file error!");
exit(1);
}
if( write( fd,&pid,sizeof(pid) ) != sizeof(pid) ) {
perror("write pid file error!");
close(fd);
exit(1);
return 0;
}
int already_run_teller(const char pidfile_pathname[128])
{
if((fd = open(pidfile_pathname, O_RDONLY | O_CREAT)) == -1) {
return -1;
}
if( (flag = read( fd, &pid, sizeof(pid) )) != sizeof(pid)) {
close(fd);
return -1;
}
}
你的修改以下才可以用。以上只是大体思路
|
用文件上锁的方式是可以的,因为如果程序结束(包括非正常结束)也会自动释放锁(因为对文件的管理是由内核来维护的)
如果用程序名称来判断是否只有一个进程存在的话,就有一个很大的问题,就是如果人家把程序名字改了后再运行,这招就不管用了
如果用程序名称来判断是否只有一个进程存在的话,就有一个很大的问题,就是如果人家把程序名字改了后再运行,这招就不管用了
|
简单的考虑使用:
cristy_cn() 说的“ps -aef|grep name 查看进程”的方法就可以,但是不能防止人们改名后启动。
复杂一些,可以这样建立一个小的共享内存标志区,存放进程的PID,启动程序先判断内存标志,如果为空,则正常启动;如果不为空,则使用“ps -aef|grep name ”察看对应的PID的进程是否存在,如果存在,则说明“已经启动”,马上退出。如果PID对应的进程不存在,说明程序已经异常退出,可以启动。
我感觉这样全面一些,你可以试一下。
cristy_cn() 说的“ps -aef|grep name 查看进程”的方法就可以,但是不能防止人们改名后启动。
复杂一些,可以这样建立一个小的共享内存标志区,存放进程的PID,启动程序先判断内存标志,如果为空,则正常启动;如果不为空,则使用“ps -aef|grep name ”察看对应的PID的进程是否存在,如果存在,则说明“已经启动”,马上退出。如果PID对应的进程不存在,说明程序已经异常退出,可以启动。
我感觉这样全面一些,你可以试一下。
|
文件上锁的方式
|
APUE第12章record locking有一段代码就是如何让一个daemon只有一份拷贝运行,使用的是文件锁,可供你参考。
|
楼上的方法很好,前面那些锁来锁去的,进程非正常结束锁就不管用了,内核中的信息才是最可靠的。
|
建立文件锁。比如firefox的:
$ls -l ~/.mozilla/firefox/32obiq6i.default/lock
lrwxrwxrwx 1 hellwolf users 19 Aug 19 10:24 /home/hellwolf/.mozilla/firefox/32obiq6i.default/lock -> 192.168.128.2:19988
但是,这样有个不好的地方,如果firefox恰好非正常退出的话,下次启动就会因为
锁文件没有删除而出错。只能手动删除改文件
$ls -l ~/.mozilla/firefox/32obiq6i.default/lock
lrwxrwxrwx 1 hellwolf users 19 Aug 19 10:24 /home/hellwolf/.mozilla/firefox/32obiq6i.default/lock -> 192.168.128.2:19988
但是,这样有个不好的地方,如果firefox恰好非正常退出的话,下次启动就会因为
锁文件没有删除而出错。只能手动删除改文件