互斥区代码

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

posted on 2012-08-07 11:21  山本二十八  阅读(384)  评论(0编辑  收藏  举报

导航