栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

linux判断进程单例的一种方式

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

linux判断进程单例的一种方式

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_ptrcache(new char[file_size+1],std::default_delete());
                    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;
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/335504.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号