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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwfddx.html