Linux旗语编程实例

来源:互联网 发布:乐器模拟软件排行 编辑:程序博客网 时间:2024/04/27 15:49
    /*旗语是一个受保护的变量。对两个或多个进程共享的资源,它可以提供限制访问的方法。       Linux的旗语就是操作系统原理中的信号量,有PV操作。可以获得和释放旗语;       释放旗语会自动唤醒下一个等待获取旗语的进程。       旗语有两种类型:       二进制旗语:代表单个资源       计数旗语:用来代表数量大于一的共享资源       GNU/Linux中的旗语实际上是一个旗语数组。说是一个旗语,实际上代表了一个包含64个旗语的数组。       GNU/Linux的这个特点允许同时对很多个旗语进行元操作。       要包含头文件:       <sys/types.h>,<sys/ipc.h>,<sys/sem.h>       message queue       semaphore array       */      //展示了旗语的创建,获得,释放,显示/修改旗语计数值,移除旗语操作      #include <sys/types.h>      #include <sys/ipc.h>      #include <sys/sem.h>      #include <stdio.h>      #define MY_SEM_ID 12321      int main(  )          {              //创建一个旗语              int semid,ret;              semid=semget( MY_SEM_ID,1,0666|IPC_CREAT );              //注意创建一个新的旗语,其计数值是不确定的,有的默认为0,要想建立可移植程序              //应该显式的初始化旗语的计数值              if( semid>=0 )                  printf( "Created a semphore %d/n",semid );              //获取当前旗语计数              int count;              count=semctl( semid,0,GETVAL );              if( count!=-1 )                  printf( "Current semaphore count is %d/n",count );              //初始化旗语的计数值              ret=semctl( semid,0,SETVAL,1 );//把1换成>1的数就会变成计数旗语              if( ret!=-1 )                  printf( "Initialize semaphore conut is 1/n");                            //获得一个旗语              int semid_acq;              struct sembuf sb; //旗语操作结构体                            semid_acq=semget( MY_SEM_ID,1,0 );              if( semid_acq>=0 )                  {                      sb.sem_num=0; //旗语号,因为是二进制旗语所以用0                      sb.sem_op=-1; //把旗语数减1,但仅在旗语数的值大于0时进行,                                    //如果已经为0,则该操作及其进程会阻断直到旗语数值增加;相当于P操作                      sb.sem_flg=0;                      printf( "Attempting to acquire semaphore %d/n",semid_acq );                      if( semop( semid_acq,&sb,1 )==-1 )                      {                          printf( "Acquired the semaphore failed %d/n",semid_acq );                          exit( -1 );                      }                      printf( "Acquired the semaphore successfully %d/n",semid_acq );                  }              //释放一个旗语              printf( "Releasing semaphore %d/n",semid_acq );              sb.sem_num=0;              sb.sem_op=1;   //旗语数加1,进行释放,相当于V操作,注意与上面设置的对称性              sb.sem_flg=0;              if( semop( semid_acq,&sb,1 )==-1)                 {                  printf( "Released semaphore failed %d/n",semid_acq );                  exit( -1 );                 }              printf( "Released semaphore sucessfully %d/n",semid_acq );              //移除一个旗语              ret=semctl( semid_acq,0,IPC_RMID );              if( ret!=-1 )                  printf( "Semaphore %d has removed/n",semid_acq );                            return 0;                        }  


原创粉丝点击