欢迎来到天天文库
浏览记录
ID:1343581
大小:549.00 KB
页数:28页
时间:2017-11-10
《linux信号量机制编程设计说明书》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux信号量机制编程设计说明书1课程设计的目的及要求1.1课程设计的目的某寺庙中有小和尚、老和尚若干人。庙内有一水缸,由小和尚提水入缸,供老和尚饮用。水缸可容纳30桶水,每次入水、取水仅为1桶,不可同时进行。水取自同一水井,水井路窄,每次只能容纳一个水桶取水,设水桶个数为5个。和尚挑水问题就是使用某种机制,能够使得若干名老和尚可以顺利地喝到水,若干名小和尚之间能够有条不紊地往水缸中入水。本课程设计的目的是使用Linux的信号量机制编程解决和尚挑水问题,通过本课程设计掌握Linux进程创建的方法,掌握信号量的使用方法。1.2课程设计的要求本课题所设计的系统要求实现以下功能。编
2、写2个程序,程序1创建3个子进程,分别编号A、B、C,用于模拟3名老和尚;程序2创建3个子进程,分别编号C、D、E,用于模拟3名小和尚。通过向屏幕输出语句模拟取水过程,如输出“目前水缸水量为10桶”表示目前水缸中有存水10桶;输出“小和尚取水成功”表示从水井中成功取到1桶水;输出“小和尚倒1桶水到水缸中”表示小和尚将128桶水倒入水缸中。通过观察输出语句,可以发现执行过程是否发成冲突。使用Linux的信号量机制,编写解决和尚挑水问题的代码。要求给出编译所用到的makefile文件。2准备工作2.1硬件及软件需要CentOS6.4gcc编译器vim编辑器2.2了解信号量及信号量的
3、系统调用函数:2.2.1信号量定义 最简单的信号量是一个只有0与1两个值的变量,二值信号量。这是最为通常的形式。具有多个正数值的信号量被称之为通用信号量。在本章的其余部分,我们将会讨论二值信号量。 P与V的定义出奇的简单。假定我们有一个信号量变量sv,两个操作定义如下: P(sv) 如果sv大于0,减小sv。如果sv为0,挂起这个进程的执行。 V(sv) 如果有进程被挂起等待sv,使其恢复执行。如果没有进行被挂起等待sv,增加sv。 28信号量的另一个理解方式就是当临界区可用时信号量变量sv为true,当临界区忙时信号量变量被P(sv)减小,从而变为false,当临界区再
4、次可用时被V(sv)增加。注意,简单的具有一个我们可以减小或是增加的通常变量并不足够,因为我们不能用C,C++或是其他的编程语言来表述生成信号,进行原子测试来确定变量是否为true,如果是则将其变为false。这就是使得信号量操作特殊的地方。信号量函数定义如下: #include intsemctl(intsem_id, intsem_num, int command, ...); intsemget(key_t key, intnum_sems, intsem_flags);intsemop(intsem_id, structsembuf *sem_o
5、ps, size_tnum_sem_ops); 事实上,为了获得我们特定操作所需要的#define定义,我们需要在包含sys/sem.h文件之前通常需要包含sys/types.h与sys/ipc.h文件。而在某些情况下,这并不是必须的。 因为我们会依次了解每一个函数,记住,这些函数的设计是用于操作信号量值数组的,从而会使用其操作向比单个信号量所需要的操作更为复杂。 注意,key的作用类似于一个文件名,因为他表示程序也许会使用或是合作所用的资源。相类似的,由semget所返回的并且为其他的共享内存函数所用的标识符与由fopen函数所返回的FILE *十分相似,因为他被进程用
6、来访问共享文件。而且与文件类似,不同的进程会有不同的信号量标识符,尽管他们指向相同的信号量。key与标识符的用法对于在这里所讨论的所有IPC程序都是通用的,尽管每一个程序会使用独立的key与标识符。282.2.1信号量集得创建与打开semget()semget函数创建一个新的信号量或是获得一个已存在的信号量键值。调用原型:intsemget(key_tkey,intnum_sems,intsem_flags);第一个参数key是一个用来允许不相关的进程访问相同信号量的整数值。所有的信号量是为不同的程序通过提供一个key来间接访问的,对于每一个信号量系统生成一个信号量标识符。信号
7、量键值只可以由semget获得,所有其他的信号量函数所用的信号量标识符都是由semget所返回的。 还有一个特殊的信号量key值,IPC_PRIVATE(通常为0),其作用是创建一个只有创建进程可以访问的信号量。这通常并没有有用的目的,而幸运的是,因为在某些Linux系统上,手册页将IPC_PRIVATE并没有阻止其他的进程访问信号量作为一个bug列出。 num_sems参数是所需要的信号量数目。这个值通常总是1。 sem_flags参数是一个标记集合,与open函数的标记十分类似。低九位
此文档下载收益归作者所有