C之信号量操作

/*
	旗语是一个受保护的变量。对两个或多个进程共享的资源,它可以提供限制访问的方法。
  	Linux的旗语就是操作系统原理中的信号量,有PV操作。可以获得和释放旗语;
  	释放旗语会自动唤醒下一个等待获取旗语的进程。
  
  	旗语有两种类型:
  	二进制旗语:代表单个资源
  	计数旗语:用来代表数量大于一的共享资源
  
  	GNU/Linux中的旗语实际上是一个旗语数组。说是一个旗语,实际上代表了一个包含64个旗语的数组。
  	GNU/Linux的这个特点允许同时对很多个旗语进行元操作。
*/
#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 );
                    return (-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 );
           	return -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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值