您的位置:首页 > 其它

Unix环境产生单实例进程方案

2011-12-30 19:52 232 查看
在一些情况下,一个进程只能产生一个实例来执行。Unix环境,提供了文件-记录锁(file- and record-locking)机制,提供了事项单实例进程的基本解决方案。



假如,一个进程在开始运行时,生成了一个文件,并且,对整个文件上锁,并且,只有一个这样的写锁允许生成。



如果,后续的进程要试图产生写锁,会导致失败。这暗示了,前面已经有实例运行了。







下面一个判断是否有实例运行的方法。每个实例,都会试图生成一个文件(/var/run/daemon.pid).如果文件已经锁上了,lockfile方法,返回失败,判断函数返回1,表示进程已经运行了。如果没有实例运行,程序,清空文件,写入进程id,返回0.



下面为一个实现的程序:



#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <syslog.h>

#include <string.h>

#include <errno.h>

#include <sys/stat.h>

#define LOCKFILE "/var/run/daemon.pid"

#define LOCKMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)

int already_running(void);

int lockfile(int );

int main(int argc,char * argv[])

{

int val = already_running();

if(val == 0)

{

printf("sart to running...\n");

}

else

{

printf("alredy running...\n");

exit(0);

}

while(1)

{

sleep(3);

printf("...\n");

}

return 0;

}

int already_running(void)

{

int fd;

char buf[16];

fd = open(LOCKFILE,O_RDWR|O_CREAT, LOCKMODE);

if(fd < 0)

{

syslog(LOG_ERR, "can't open %s: %s", LOCKFILE, strerror(errno));

exit(1);

}

if(lockfile(fd) < 0)

{

if (errno == EACCES || errno == EAGAIN)

{

close(fd);

return 1;

}

syslog(LOG_ERR,"can't lock %s: %s", LOCKFILE, strerror(errno));

exit(1);

}

ftruncate(fd,0);

sprintf(buf,"%ld",(long)getpid());

write(fd,buf,strlen(buf) + 1);

return 0;

}

int lockfile(int fd)

{

struct flock fl;

fl.l_type = F_WRLCK;

fl.l_start = 0;

fl.l_whence = SEEK_SET;

fl.l_len = 0;

return(fcntl(fd, F_SETLK, &fl));

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: