当前位置: 技术问答>linux和unix
请大家帮我看看这样做来确保UNIX某程序同时只有一个进程运行可以吗?
来源: 互联网 发布时间:2015-04-24
本文导语: 请大家帮我看看这样做来确保UNIX某程序同时只有一个进程运行可以吗? 环境为Sco OpenServer5.0.5。 isAloneProcess返回1表示为第一个进程,0表示已有进程启动,负数表示出错; key为一约定的文件名,同一程序采用同样的...
请大家帮我看看这样做来确保UNIX某程序同时只有一个进程运行可以吗?
环境为Sco OpenServer5.0.5。
isAloneProcess返回1表示为第一个进程,0表示已有进程启动,负数表示出错;
key为一约定的文件名,同一程序采用同样的值(文件的绝对路径名)。本函数在main的开头调用,打开的文件及其上的锁不关闭不撤销,等进程退出时自动关闭。
我这样做可靠吗?有什么地方可以改进?或者谁有其它简单可靠的方法,最好给出样例程序。谢谢!
#include
#include
#include
#include
int isAloneProcess(char * key)
{
int fd;
struct flock fl;
fl.l_type = F_WRLCK;
fl.l_start = 0;
fl.l_whence = 0;
fl.l_len = 0;
fl.l_pid = getpid();
fd = open(key, O_RDWR|O_CREAT|O_TRUNC);
if (-1 == fd) return -1000-errno;
if (-1 == fchmod(fd, S_IRUSR|S_IWUSR)) return -2000-errno;
if (0 == fcntl(fd, F_SETLK, &fl)) return 1;
else
{
if (EACCES == errno) return 0;
else return -3000-errno;
}
}
环境为Sco OpenServer5.0.5。
isAloneProcess返回1表示为第一个进程,0表示已有进程启动,负数表示出错;
key为一约定的文件名,同一程序采用同样的值(文件的绝对路径名)。本函数在main的开头调用,打开的文件及其上的锁不关闭不撤销,等进程退出时自动关闭。
我这样做可靠吗?有什么地方可以改进?或者谁有其它简单可靠的方法,最好给出样例程序。谢谢!
#include
#include
#include
#include
int isAloneProcess(char * key)
{
int fd;
struct flock fl;
fl.l_type = F_WRLCK;
fl.l_start = 0;
fl.l_whence = 0;
fl.l_len = 0;
fl.l_pid = getpid();
fd = open(key, O_RDWR|O_CREAT|O_TRUNC);
if (-1 == fd) return -1000-errno;
if (-1 == fchmod(fd, S_IRUSR|S_IWUSR)) return -2000-errno;
if (0 == fcntl(fd, F_SETLK, &fl)) return 1;
else
{
if (EACCES == errno) return 0;
else return -3000-errno;
}
}
|
我觉得可以使用一个文件,将该进程的PID写进去,这样当另一实例起来时,读此文件,取得PID,检查该PID 是否是同一类程序,如果是,就自己kill自己,否则前一pid已非自然死亡,可以从文件中删除前pid,写入自己的pid.(自然该文件的读写需要上锁)。
还有,启动另一daemon,和此程序的唯一实例进行通信,定时握手,如果唯一实例非正常死亡,daemon可以kill 该pid, 重新启动此程序的另一实例,该实例启动时将pid写入到文件中。
还有,启动另一daemon,和此程序的唯一实例进行通信,定时握手,如果唯一实例非正常死亡,daemon可以kill 该pid, 重新启动此程序的另一实例,该实例启动时将pid写入到文件中。