先贴代码:
#include <stdio.h>
#include <string.h>
#include <sys/types.h> /* about files */
#include <sys/stat.h>
#include <sys/file.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
/* pid 文件 */
#define LOCK_FILE "/var/run/daemon.pid"
#define LOCKMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
/* fcntl */
#define read_lock(fd, offset, whence, len) lock_reg((fd), F_SETLK, F_RDLCK, (offset), (whence), (len))
#define readw_lock(fd, offset, whence, len) lock_reg((fd), F_SETLKW, F_RDLCK, (offset), (whence), (len))
#define write_lock(fd, offset, whence, len) lock_reg((fd), F_SETLK, F_WRLCK, (offset), (whence), (len))
#define writew_lock(fd, offset, whence, len) lock_reg((fd), F_SETLKW, F_WRLCK, (offset), (whence), (len))
#define un_lock(fd, offset, whence, len) lock_reg((fd), F_SETLK, F_UNLCK, (offset), (whence), (len))
/* fcntl函数封装 */
int lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len){
struct flock lock;
lock.l_type = type; /* F_RDLCK, F_WRLCK, F_UNLCK */
lock.l_start = offset; /* byte offset, relative to l_whence */
lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */
lock.l_len = len; /* #bytes (0 means to EOF) */
return (fcntl(fd, cmd, &lock));
}
/* 实现单实例进程 */
int process_already_running(){
int fd;
char buf[32];
fd =open(LOCK_FILE, O_RDWR|O_CREAT, LOCKMODE);
if(fd<0){
Log.Add(LOG_FILE,"can't open %s: %s",LOCK_FILE,strerror(errno));
if(errno==EEXIST){
Log.Add(LOG_FILE,"This process already running : %s",strerror(errno));
}
exit(1);
}
/* 写锁 */
if(write_lock(fd,0,SEEK_SET,0)<0){
close(fd);
exit(1);
}
ftruncate(fd,0);
snprintf(buf,32,"%ld",(long)getpid());
write(fd,buf,strlen(buf)+1);
return(0);
}