• 互斥区代码


    char *getCurrFileName()
    {
          FILE *stream;
          char fullname[1024];
          stream=popen("pwd","r");
          fread(fullname,sizeof(char),sizeof(fullname),stream);
          {
             int i;
             for(i=0;i<strlen(fullname);i++)
               {
                        if(fullname[i]=='\n')
                         {
                          fullname[i]=0;
                            break;
                      }
                 }
          }
          sprintf(fullname,"%s/%s",fullname,__FILE__);
          pclose(stream);
          return fullname;
    }

    int createCriticalSection(int id)
    {
        key_t sem_key=ftok(getCurrFileName(),id );
        int SemID=-1;
        int oflag = S_IRWXU | S_IRWXG | S_IRWXO;
        union semun arg;
        if ((SemID=semget(sem_key, 1, oflag | IPC_CREAT | 0660)) == -1)
        {
            return -1;
        }
            
        arg.val=1;
        if (semctl(SemID, 0, SETVAL, arg) == -1)
        {
            return -1;
        }
        return SemID;
    }
    /*
        @return 0   :成功
                其他:失败
    */

    int enterCriticalSection(int semID)
    {
        struct sembuf   ops;
        int                rt;
        sigset_t        allset;

        ops.sem_num = 0;
        ops.sem_op = -1;
        ops.sem_flg = 0;

        sigfillset(&allset);
        sigprocmask(SIG_SETMASK, &allset, &oldset);

        if ((rt = semop(semID, &ops, 1)) == -1)
        {
            sigprocmask(SIG_SETMASK, &oldset, NULL);
        }
        return rt;
    }

    int releaseCriticalSection(int semID)
    {
        struct sembuf   ops;
        int                rt;
        ops.sem_num = 0;
        ops.sem_op = 1;
        ops.sem_flg = 0;

        rt = semop(semID, &ops, 1);

        sigprocmask(SIG_SETMASK, &oldset, NULL);

        return rt;
    }

    int delCriticalSection(int semID)
    {
        if (semID != -1)
        {
            if (semctl(semID, IPC_RMID, NULL) != 0)
            {

                    fprintf(stderr, "Failed to IPC_RMID semid:%d !\n", semID);
                return -1;
            }  
            return 0;
        }
        return -1;
    }

    ///使用

    int criSec;
    criSec=createCriticalSection(0);
    if(enterCriticalSection(criSec)==0)//成功
    {}
    releaseCriticalSection(criSec);

     delCriticalSection(criSec); 

  • 相关阅读:
    用__new__ 创建单例模式
    函数的列表作为默认参数
    循环闭包函数打印列表
    斐波那契函数和回调函数
    类的共享属性
    字典和format用法
    python 面试大全: 01_类变量在内部是作为字典处理的
    git 学习删除某次提交
    mysql调优
    re模块
  • 原文地址:https://www.cnblogs.com/hbt19860104/p/2626393.html
Copyright © 2020-2023  润新知