Linux旗语编程实例

    /*旗语是一个受保护的变量。对两个或多个进程共享的资源,它可以提供限制访问的方法。 
      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;  
              
        }  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值