欢迎来到天天文库
浏览记录
ID:14075548
大小:45.50 KB
页数:6页
时间:2018-07-25
《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; //最后一次成功修改该信号量数组的时间。 time_tsem
3、_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返回的semid号。no
6、ps:是数组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指定了SEM_UNDO标志,则
7、信号量的调整值减去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,../*unionsemunarg*/);其中semid是信号量集
8、合,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:semid集合中所有信号量的值。IPC_RMID:
9、删除semid信号量集GETPID:返回最后成功操作该信号的进程号。IPC_STAT:返回semid集合中的structsemid_ds结构。下面练习熟悉systemV信号量的操作,用systemV实现多个进程的互斥[cpp]viewplaincopyprint?1./*sem.c*/ 2.#include 3.#include 4.#include 5.#include
此文档下载收益归作者所有