/*旗语是一个受保护的变量。对两个或多个进程共享的资源,它可以提供限制访问的方法。 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; }
Linux旗语编程实例
内容版权声明:除非注明,否则皆为本站原创文章。