bool initSigleInstanceLock(const std::string &processName)
{
//
bool ret=false;
static const char *lockFileName="/tmp/daemon_service.lck";
int fd=-1;
do{
fd=open(lockFileName,O_RDWR|O_CREAT|__O_CLOEXEC,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(fd<=0)
{
AIMY_ERROR("open %s failed[%s]",lockFileName,strerror(errno));
break;
}
AIMY_INFO("open %s success",lockFileName);
int flags=LOCK_EX;;
int iret=0;
iret = flock(fd,flags);
if(iret!=0)
{
AIMY_ERROR("%s is locking[%d->%s]",lockFileName,iret,strerror(errno));
break;
}
AIMY_INFO("flock %s success",lockFileName);
//check pid
char buf[32]={0};
memset(buf,0,32);
auto len=read(fd,buf,31);
bool isexisted=false;
if(len>0)
{
auto work_pid=std::stoi(buf);
AIMY_INFO("work_pid %d %s",work_pid,processName.c_str());
memset(buf,0,32);
sprintf(buf,"/proc/%d/stat",work_pid);
FILE *fp=fopen(buf,"r");
do{
if(!fp)break;
size_t file_size=500;//max size
std::shared_ptr
memset(cache.get(),0,file_size+1);
auto read_len=fread(cache.get(),1,file_size,fp);
if(read_len<=1)break;
int pid=0;
char pro_name[256];
AIMY_INFO("%s",cache.get());
sscanf(cache.get(),"%d (%[^)]",&pid,pro_name);
AIMY_INFO("%d %s",pid,pro_name);
if(processName==pro_name)
{
isexisted=true;
}
}while(0);
if(fp)fclose(fp);
}
if(isexisted)
{
AIMY_ERROR("process %s is working!",processName.c_str());
break;
}
//write pid
FILE *fp=fopen(lockFileName,"w+");
if(!fp)
{
AIMY_ERROR("open %s error[%s]!",lockFileName,strerror(errno));
break;
}
fprintf(fp,"%d",getpid());
fclose(fp);
fsync(fp->_fileno);
ret=true;
}while(0);
if(fd>0)
{
flock(fd,LOCK_UN);
::close(fd);
}
return ret;
}



