linux编程练习 --systemv信号灯(信号量)

linux编程练习 --systemv信号灯(信号量)

ID:1990065

大小:45.50 KB

页数:6页

时间:2017-11-14

linux编程练习 --systemv信号灯(信号量)_第1页
linux编程练习 --systemv信号灯(信号量)_第2页
linux编程练习 --systemv信号灯(信号量)_第3页
linux编程练习 --systemv信号灯(信号量)_第4页
linux编程练习 --systemv信号灯(信号量)_第5页
资源描述:

《linux编程练习 --systemv信号灯(信号量)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Linux编程练习--SystemV信号灯(信号量)分类:Linux编程练习2009-03-1414:38861人阅读评论(0)收藏举报1.综述信号灯也可以说是一种锁,但它可以用来控制除了文件以外的更多资源。信号灯的初始值一般为一个正数,决定了可以分配的资源数,为进程分配一个资源后自减,减到0后被锁住。SysVIPC要求信号灯必须定义为一个集合。创建信号量时则指定此集合中的值。双态信号灯是最简单的一种,0表示锁定,无资源;1表示解锁,有一个可用资源。2.内核中与信号量有关的数据结构内核中维持一份

2、全局的structsemid_ds数组,semid_ds是信号量集合的结构。semget函数返回这个信号量集合在数组中的小标。structsemid_ds{   structipc_permsem_perm; //该信号量集合的操作许可权限   structsem*sem_base;   //该数组的元素是:该集合包含的信号量的结构。   ushortsem_nsems;  //sem_base数组的个数   time_tsem_otime; //最后一次成功修改该信号量数组的时间。   tim

3、e_tsem_ctime; //成功创建的时间};structsem{   ushortsemval; //信号量的当前值   shortsempid; //最后一次返回该信号量的进程的id号   ushortsemncnt;//等待semval大于当前值的进程的个数   ushortsemzcnt;//等待semval变成0的进程的个数};3.信号灯操作A.创建新信号量intshmget(key_tkey,intnsems,intflag);返回值是信号量标示符。key:key_t是int型的

4、,这个是一个整数,要保证内核唯一性。nsems:该集合包含的信号量的个数。flag:创建的权限,可以使一些读写权限与:IPC_CREAT(

5、IPC_EXCL)的按位或。当该函数成功时,linux内核中的semval值为0,但是该值的初始化没有可移植性(就是说不能保证所有系统都能初始化该值)这个函数的作用:创建或者打开信号量集。B.对一个已打开的信号量集的若干信号量操作控制intsemop(intsemid,structsembuf*opsptr,size_tnops);semid:是semget

6、返回的semid号。nops:是数组opsptr的个数。opsptr是操作结构的数组structsembuf{  shortsem_num;  //信号量在semid集合中的序号:0到nsems-1;  shortsem_op;  //操作  shortsem_flag;  //0,IPC_NOWAIT,SEM_UNDO};其中,sem_op值如下:semval为信号量当前值a、如果sem_op大于0,表示sem_num信号量所代表的资源的释放,semval+=sem_op;如果sem_flag

7、指定了SEM_UNDO标志,则信号量的调整值减去sem_op;b、如果sem_op小于0,表示sem_num信号量所代表资源的分配,具体是:如果semval大于等于sem_op的绝对值,则semval-=sem_op绝对值,成为新值;否则,阻塞知道条件满足,挂起(设IPC_NOWAIT会返回)c、如果sem_op等于0,表示直到semval等于0时才返回,否则一直挂起。C.对信号量集实行控制操作intsemctl(intsemid,intsemnum,intcmd,../*unionsemuna

8、rg*/);其中semid是信号量集合,semnum是信号在集合中的序号,unionsemun{   intval;/*cmd==SETVAL*/   structsemid_ds*buf/*cmd==IPC_SET或者cmd==IPC_STAT*/   ushort*array;/*cmd==SETALL,或cmd=GETALL*/};cmd是控制命令,参数可选cmd取值如下:GETVAL,SETVAL:semid集合中semnum信号量当前的semval值GETALL,SETALL:semi

9、d集合中所有信号量的值。IPC_RMID:删除semid信号量集GETPID:返回最后成功操作该信号的进程号。IPC_STAT:返回semid集合中的structsemid_ds结构。下面练习熟悉systemV信号量的操作,用systemV实现多个进程的互斥[cpp]viewplaincopyprint?1./*sem.c*/  2.#include   3.#include   4.#include   5.#include

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

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

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