【武汉华嵌嵌入式培训中心】linux进程间通信之信号量new

【武汉华嵌嵌入式培训中心】linux进程间通信之信号量new

ID:18254540

大小:47.50 KB

页数:7页

时间:2018-09-16

【武汉华嵌嵌入式培训中心】linux进程间通信之信号量new_第1页
【武汉华嵌嵌入式培训中心】linux进程间通信之信号量new_第2页
【武汉华嵌嵌入式培训中心】linux进程间通信之信号量new_第3页
【武汉华嵌嵌入式培训中心】linux进程间通信之信号量new_第4页
【武汉华嵌嵌入式培训中心】linux进程间通信之信号量new_第5页
资源描述:

《【武汉华嵌嵌入式培训中心】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)

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。