zoukankan      html  css  js  c++  java
  • 互斥区代码

    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); 

  • 相关阅读:
    GCC的gcc和g++的区别
    C++运行程序依赖的环境-vcredist_x64.exe
    linux账户管理[转自vbird]
    Linux 的账号与群组[转自vbird]
    文件的搜寻【转vbird】
    常用的文件和目录操作命令【转vbird】
    十六进制查看器【转】
    文件与目录的默认权限与隐藏权限【转vbird】
    改变文件属性与权限(转)
    Linux目录规范和含义(转)
  • 原文地址:https://www.cnblogs.com/hbt19860104/p/2626393.html
Copyright © 2011-2022 走看看