




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux编程练习 -SystemV信号灯(信号量) 分类: Linux编程练习 2009-03-14 14:38 861人阅读 评论(0) 收藏 举报 1.综述信号灯也可以说是一种锁,但它可以用来控制除了文件以外的更多资源。信号灯的初始值一般为一个正数,决定了可以分配的资源数,为进程分配一个资源后自减,减到0后被锁住。SysV IPC要求信号灯必须定义为一个集合。创建信号量时则指定此集合中的值。双态信号灯是最简单的一种,0表示锁定,无资源;1表示解锁,有一个可用资源。2.内核中与信号量有关的数据结构内核中维持一份全局的struct semid_ds数组,semid_ds是信号量集合的结构。semget函数返回这个信号量集合在数组中的小标。struct semid_ds struct ipc_perm sem_perm; /该信号量集合的操作许可权限 struct sem *sem_base; /该数组的元素是:该集合包含的信号量的结构。 ushort sem_nsems; /sem_base数组的个数 time_t sem_otime; /最后一次成功修改该信号量数组的时间。 time_t sem_ctime; /成功创建的时间;struct sem ushort semval; /信号量的当前值 short sempid; /最后一次返回该信号量的进程的id号 ushort semncnt; /等待semval大于当前值的进程的个数 ushort semzcnt; /等待semval变成0的进程的个数;3.信号灯操作A.创建新信号量int shmget(key_t key, int nsems, int flag); 返回值是信号量标示符。key: key_t是int型的,这个是一个整数,要保证内核唯一性。nsems:该集合包含的信号量的个数。flag:创建的权限, 可以使一些读写权限与:IPC_CREAT ( | IPC_EXCL )的按位或。当该函数成功时,linux内核中的semval值为0,但是该值的初始化没有可移植性(就是说不能保证所有系统都能初始化该值)这个函数的作用:创建或者打开信号量集。B.对一个已打开的信号量集的若干信号量操作控制int semop(int semid, struct sembuf *opsptr, size_t nops);semid:是semget返回的semid号。nops:是数组opsptr的个数。opsptr是操作结构的数组struct sembuf short sem_num; /信号量在semid集合中的序号:0到nsems - 1; short sem_op; /操作 short sem_flag; /0, IPC_NOWAIT, SEM_UNDO;其中,sem_op值如下:semval为信号量当前值a、如果sem_op大于0,表示sem_num信号量所代表的资源的释放,semval += sem_op;如果sem_flag指定了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.对信号量集实行控制操作int semctl(int semid, int semnum, int cmd, ./* union semun arg */);其中semid是信号量集合,semnum是信号在集合中的序号,union semun int val; /* cmd = SETVAL */ struct semid_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:删除semid信号量集GETPID:返回最后成功操作该信号的进程号。IPC_STAT:返回semid集合中的struct semid_ds结构。下面练习熟悉system V信号量的操作,用system V实现多个进程的互斥cpp view plaincopyprint?1. /*sem.c*/2. #include 3. #include 4. #include 5. #include 6. #include 7. #include 8. #include 9. intmain(intargc,char*argv)10. 11. key_tipckey;12. intsemid;13. /*建立两个信号灯结构*/14. structsembufsem2;/*sembufdefinedinsys/sem.h*/15. /*创建IPCKey*/16. ipckey=ftok(/tmp/foo,42);17. /*创建信号量.4=READ,2=ALTER*/18. semid=semget(ipckey,1,0666|IPC_CREAT);19. if(semid0)20. 21. printf(Error-%sn,strerror(errno);22. _exit(1);23. 24. /*设置*/25. /*Theseneverchangesoleavethemoutsidetheloop*/26. sem0.sem_num=0;27. sem1.sem_num=0;28. sem0.sem_flg=SEM_UNDO;/*Releasesemaphoreonexit*/29. sem1.sem_flg=SEM_UNDO;/*Releasesemaphoreonexit*/30. while(1)31. 32. printf(%sWaitingforthesemaphoretobereleasedn/n,argv1);33. /*设置两个信号灯,灯1等待,灯2请求资源锁*/34. sem0.sem_op=0;/*Waitforzero*/35. sem1.sem_op=1;/*Add1tolockit*/36. /*设置信号量集,两个信号量*/37. semop(semid,sem,2);38. /*资源锁区*/39. printf(%sIhavethesemaphoren/n,argv1);40. sleep(rand()%3);41. /*Criticalsection,sleepfor0-2seconds*/42. sem0.sem_op=-1;/*Decrementtounlock*/43. /*出锁,对信号量1操作*/44. semop(semid,sem,1);45. printf(%sReleasedsemaphoren/n,argv1);46. sleep(rand()%3);/*Sleep0-2seconds*/47. 48. 编译然后运行时输入:$ ./sem a & ./sem b &结果如下:a Waiting for the semaphore to be releaseda I have the semaphoreb Waiting for the semaphore to be releaseda Released semaphoreb I have the semapho
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广西北部湾国际港务集团有限公司秋季招聘501人笔试参考题库附带答案详解
- 工信局安全生产培训课件
- 2025年河北唐山市芦台经济开发区公开招聘区属国有企业工作人员考试历年参考题附答案详解
- 2025年度黄河勘测规划设计研究院有限公司公开招聘高校毕业生90人笔试参考题库附带答案详解
- 2025年大学铁路警务专业题库- 铁路警务的专业学习
- 2025年大学涉外警务专业题库- 涉外警务中的外事情报与信息交流
- 2025年大学出入境管理专业题库- 出入境管理社会合作
- 2025年大学涉外警务专业题库- 涉外警务中的国际法益保障
- 2025年大学反恐警务专业题库- 反恐警务专业的专业实践项目
- 2025年大学边防管理专业题库- 边防管理与文化传播研究
- 物业管理安全生产责任制细则
- 2025年检查检验项目分级审核制度
- ISO28000:2022供应链安全管理体系
- MOOC 电工电子实验基础-东南大学 中国大学慕课答案
- 口腔颌面外科学第十章 口腔颌面部损伤
- JJG 520-2005粉尘采样器
- stata回归结果详解-stata回归解释
- 审计综合实训(周海彬)答案项目三+货币资金审计程序表
- 药品经营质量风险分析评估报告
- 小学科学苏教四年级上册1单元动物大家族2《鱼类》教案
- 团队协作的五大障碍课件
评论
0/150
提交评论