欢迎来到天天文库
浏览记录
ID:18254540
大小:47.50 KB
页数:7页
时间:2018-09-16
《【武汉华嵌嵌入式培训中心】linux进程间通信之信号量new》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux进程间通信之信号量作者:武汉华嵌嵌入式培训中心技术部 信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。在UNIX下有三种分别如下:·Posix有名信号量;·Posix基于内存的信号量;·SystemV信号量。在这里只和大家分享下有关SystemV信号量。SystemV通过定义计数信号量集来对信号量的操作,计数信号量集是一个或多个信号量构成一个集合,其中每个都是计数信号量。对于系统中的每个信号量集,内核维护一个如下的信息结构,它定义在头文件中。structse
2、mid_ds{structipc_perm sem_perm; /*operationpermissionstruct*/structsem *sem_base; /*ptrtoarrayofsemaphoresinset*/uishort sem_nsems; /*#ofsemaphoresinset*/time_t sem_otime; /*timeoflastsemop()*/time_t sem_ctime; /*timeof
3、creationorlastIPC_SET*/}; 成员structsem结构如下: structsem{ ushort_t semval; /*semaphorevalue,nonnegative*/ short sempid; /*PIDoflastsuccessfulsemop(),SETVAL,SETALL*/ ushort_t semncnt; /*awaitingsemval>currentvalue*/ us
4、hort_t semzcnt; /*awaitingsemval=0*/ }; 注意在structsemid_ds结构中的sem_base含有指向某个sem结构数组的指针:当前信号量集中的每个信号对应其中一个数组元素。我们可以把内核中的某个选定信号量图解成指向一个sem结构数组的一个semid_ds结构。图解如下:有了以上的理论,那么接下来我们来探讨下如何对这样的信号量进行操作,linux操作系统为我们提供了操作systemv信号量的API函数,以下就开始讲解这些API函数。·semget函数
5、创建一个信号量集或访问一个已存在的信号量集。#includeintsemget(key_tkey,intnsems,intoflag);该函数成功返回时,其返回值是一个称为信号量标识符的整数,semop和semctl使用它。出错则返回-1。nsems参数指定集合中的信号量数。如果我们创建一个新的信号量集,而只是访问一个已存在的集合,那就可以把该参数指定为0。一旦创建完一个信号量集,我们就不能改变其中的信号量数。oflag值是一些权限值的组合,如果是创建一个信号量集,那么得在此oflag的基础
6、上或上O_CREAT或者是O_CREAT
7、O_EXCL。此函数不可以对创建的信号量集中的信号量进行初始化,对信号量的初始化是通过另外的一个函数semctl进行的。·通过semctl函数对信号量集中的信号量进行初始化。#includeintsemctl(intsemid,intsemnum,intcmd,…./*unionsemunarg*/ ); semid标识其操作待控制的信号量集。 semnum标识该信号量集内的某个成员(0,1等待,直到nsems-1)。se
8、mnum值仅仅用于GETVAL、SETVAL、GETNCNT、GETZCNT和GETPID命令。 第四个参数是可选的,取决于第三个参数cmd。unionsemnu结构如下:unionsemnu{ int val; /*usedforSETVALonly*/ structsemid_ds *buf; /*usedforIPC_SETandIPC_STAT*/ ushort *array; /*usedfor
9、GETALLandSETALL*/ }; 这个联合体并没有出现在任何头文件中,因而必须由应用程序声明。第三个参数cmd可以取以下值:GETVAL 把semval的当前值作为函数返回值返回。SETVAL 把semval值设置为arg.val。如果操作成功,那么相应信号量在所有进程是的信号 量调整值(semadj)
此文档下载收益归作者所有