山大操作系统实验5
山东大学《数据库系统》上机实验答案 详细整理 2021最新版
山东大学《数据库系统》上机实验答案详细整理 2021最新版数据库实验(一)熟悉环境、建立/删除表、插入数据Drop table 表名update dbtest set test=1 select * from dbscore1.教师信息(教师编号、姓名、性别、年龄、院系名称)test1_teacher:tid char 6 not null、name varchar 10 not null、sex char 2、age int、dname varchar 10。
根据教师名称建立一个索引。
教师编号 100101 100102 100103 教师姓名张老师李老师马老师性别男女男年龄 44 45 46 院系名称计算机学院软件学院计算机学院1、create table test1_teacher(tid char(6) primary key, name varchar(10) not null,sex char(2), age int,dname varchar(10) )2.学生信息(学生编号、姓名、性别、年龄、出生日期、院系名称、班级)test1_student:sid char 12 not null、name varchar 10 not null、sex char 2、age int、birthday date(oracle的date类型是包含时间信息的,时间信息全部为零)、dname varchar 10、class varchar(10)。
根据姓名建立一个索引。
学号 202100020211 202100020212 202100020213 姓名王欣李华赵岩性别女女男年龄192018出生日期院系名称班级 2021 2021 2021 1994-2-2 计算机学院 1995-3-3 1996-4-4 软件学院软件学院 2、create table test1_student(sid char(12) primary key, name varchar(10) not null, sex char(2), age int,birthday date,dname varchar(10), class varchar(10) )3.课程信息(课程编号、课程名称、先行课编号、学分)test1_course:cid char 6 not null、name varchar 10 not null、fcid char 6、credit numeric 2,1(其中2代表总长度,1代表小数点后面长度)。
山大操作系统实验
操作系统原理实验报告——实验一张咪软件工程四班一、实验目的加深对于进程并发执行概念的理解。
实践并发进/线程的创立和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创立、变换、撤销状态变换的过程。
掌握进程控制的方法,了解父子进程间的控制和协作关系。
练习Linux系统中进/线程创立与控制有关的系统调用的编程和调试技术。
二、实验要求编写一个多进程并发执行程序。
父进程每隔3秒重复建立两个子进程,首先创立的让其执行ls命令,之后创立执行让其执行ps命令,并控制ps命令总在ls命令之前执行。
三、实验软硬件环境实验环境均为Linux操作系统,开发工具为gcc和g++。
四、实验思路调用fock()创立子进程。
创立键盘中断信号后,使用pause()可以暂停子进程执行,继续创立新的子进程。
子进程并发执行子进程可以首先通过键盘中断信号唤醒子进程。
通过exec()调用族装入一个新的执行程序。
在建立子进程2并且唤醒子进程1后子进程sleep(seconds = 5)。
这样就可以先执行ps后执行ls。
最后就是父进程的结束,程序结束。
五、实验模型六、调试排错1、首先遇到的问题是,对linux的操作不熟悉,不太明白makefile怎么使用,直接用了gcc2、在创立多个子进程上遇到了问题,在fock〔〕后又直接跟了一个fork〔〕,这样创立的子进程是子进程的子进程,而不是父进程创立的第二个子进程。
所以应该在else语句块后面,也就是主进程执行段继续创立。
一般情况下,fork()按如下规那么编程:main(){ pid_t pid;pid=fork();if(pid<0) { // 建立子进程失败{ printf("Create Process fail!\n");exit(EXIT_FAILURE); }if (pid = = 0)//子进程代码;//如果需要创立子进程,可以按该方法嵌套else//父进程代码//如果需要创立子进程,可以按该方法嵌套}3、后来父进程与子进程无法重复建立,执行一次就结束了,又加了一个while循环实现重复建立,但无法退出,一直执行。
山大操作系统实验5
进程同步实验张咪软件四班一、实验目的总结和分析示例实验和独立实验中观察到的调试和运行信息,说明您对与解决非对称性互斥操作的算法有哪些新的理解和认识?为什么会出现进程饥饿现象?本实验的饥饿现象是怎样表现的?怎样解决并发进程间发生的饥饿现象?您对于并发进程间使用消息传递解决进程通信问题有哪些新的理解和认识?根据实验程序、调试过程和结果分析写出实验报告。
二、实验要求理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。
此外还有一间等候室,可容纳13位顾客等候进入理发室。
顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。
在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。
顾客理完发后,可向任何一位理发师付款。
但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。
理发师在没有顾客的时候就坐在理发椅子上睡眠。
理发师的时间就用在理发、收款、睡眠上。
请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。
三、实验环境实验环境均为Linux操作系统,开发工具为gcc和g++。
四、实验思路约束:1.设置一个count变量来对顾客进行计数,该变量将被多个顾客进程互斥地访问并修改,通过一个互斥信号量mutext来实现。
count>20时,就不进入理发店。
7<count<20时,count++,顾客申请等候室,进入等候室等待,用一个room信号量控制。
然后等待申请沙发,用一个sofa信号量控制。
然后申请椅子。
3<count<7时,count++,顾客坐在沙发上等待,等待申请椅子。
count<3时,count++,顾客坐在椅子上等待理发。
2.只有在理发椅空闲时,顾客才能做到理发椅上等待理发师理发,否则顾客便必须等待;只有当理发椅上有顾客时,理发师才可以开始理发,否则他也必须等待。
山东大学操作系统实验五
软件学院操作系统实验报告实验题目:实验五、进程互斥实验学号:201100300124日期:2013年05月20日班级:5班姓名:韩俊晓Email:hanjunxiao188@实验目的:进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法,加深对于非对称性互斥问题有关概念的理解。
观察和体验非对称性互斥问题的并发控制方法。
进一步了解Linux系统中IPC进程同步工具的用法,训练解决对该类问题的实际编程、调试和分析问题的能力。
实验要求:理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。
此外还有一间等候室,可容纳13位顾客等候进入理发室。
顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。
在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。
顾客理完发后,可向任何一位理发师付款。
但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。
理发师在没有顾客的时候就坐在理发椅子上睡眠。
理发师的时间就用在理发、收款、睡眠上。
请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。
硬件环境:实验室计算机软件环境:Ubuntu08.4-Linux操作系统BASH_VERSION='3.2.33(1)-releasegcc version 4.1.2gedit 2.18.2OpenOffice 2.3实验步骤:实验思路:(1)对于理发师进程可以创建两个子进程,这样父子进程就构成了三个理发师,控制对顾客的理发过程,同时对账本采用互斥记账方法(2)对于消费者进程,则创建四个消息队列,分别为sofa_quest,sofa_respond,wait_quest,wait_respond,分别响应不同的信号请求,打印不同的信息。
1.实验说明:在linux系统中可以利用进程间通信(interprocess communication )IPC 中的3个对象:共享内存、信号灯数组、消息队列,来解决协作并发进程间的同步与互斥的问题。
山东大学计算机网络实验报告 实验五
软件学院计算机网络实验报告实验五传输协议控制姓名班级2013级软件1班学号实验名称传输控制协议(TCP)实验时间 2015.12实验目的:1.掌握TCP协议的报文格式;2.掌握TCP连接的建立和释放过程;3.掌握TCP数据传输中编号与确认的过程;4.掌握TCP协议校验和的计算方法;5.理解TCP重传机制。
实验步骤及结果:该实验采用网络拓扑结构一练习一练习名称:察看TCP连接的建立和释放练习内容:各主机打开协议分析器,进入相应的网络结构并验证网络拓扑的正确性,如果通过拓扑验证,关闭协议分析器继续进行实验,如果没有通过拓扑验证,请检查网络连接。
本练习将主机A、B、C、D、E、F作为一组进行实验。
1. 主机B、C、D启动协议分析器捕获数据,并设置过滤条件(提取TCP协议)。
2. 主机A启动TCP工具连接主机C。
(1)主机A启动“实验平台工具栏中的地址本工具”。
点击[主机扫描]按钮获取组内主机信息,选中主机C点击[端口扫描]按钮获取主机C的TCP端口列表。
(2)主机A启动“实验平台工具栏中的TCP工具”。
选中“客户端”单选框,在“地址”文本框中填入主机C的IP地址,在“端口”文本框中填入主机C的一个TCP端口,点击[连接]按钮进行连接。
3. 察看主机B、C、D捕获的数据,填写下表。
字段名称报文1 报文2 报文3序列号4035280841 655101085 4035280842确认号0 4035280842 655101086ACK 0 1 1SYN 1 1 0● TCP连接建立时,前两个报文的首部都有一个“最大字段长度”字段,它的值是多少?作用是什么?结合IEEE802.3协议规定的以太网最大帧长度分析此数据是怎样得出的。
答:两个报文首部的“最大字段长度”字段值均为为1460。
作用表示在一个帧中数据部分最大长度为1460,不能发出比此更长的帧。
以太网中规定发出的帧长度不能超过1500,而IP首部的长度为20个字节,TCP首部的长度为20个字节。
山东大学嵌入式实验报告
嵌入式实验报告班级:电信工X班姓名:XXX 学号:20120012XXXX实验一、ARM汇编指令实验-简单数据搬移实验实验目的:熟悉实验开发环境,掌握简单ARM汇编的使用方法实验内容熟悉开发环境并使用LDR/STR,MOV等指令访问寄存器或存储单元;使用ADS/SUB/LSL/LSR/AND/ORR等指令完成基本数学/逻辑运算。
实验要求(1)按照前面叙述介绍的方法,在ADS下创建一个工程asmlabl,定义两个变量x,y和堆栈地址0x1000,将变量x的内容存到堆栈顶,然后计算x+y,并将和存到堆栈的下一个单元。
通过AXD查看寄存器和memory和寄存器中数据的变化。
(2)在指令后面加上适当注释,说明指令功能。
(3)指出程序执行后各相关寄存器及存储器单元的具体内容。
程序代码截图如下:程序运行结果截图:由实验结果可知堆栈的第二个单元中存放了x+y的值6D练习题编写程序实现对一段数据的最大值和最小值搜索,最大值存在于max变量之中,最小值存在于min变量之中。
提示:数据的定义采用伪指令:DCD来实现。
基本思路:利用R0做基地址,将R1,R2分别放入第一单元的内容,利用R3做循环计数,利用R4遍历读取第2至最后一个数据,如果R1的数据小于新读入的R4数据则将R4的内容存入R1,如果R2的内容大于R4的内容则将R4的内容存入R2,。
遍历完成之后,R1将存放最大数据,R2将存放最小数据。
程序代码截图如下:程序运行结果截图:实验二ARM汇编指令实验2-字符串拷贝实验实验目的通过实验掌握使用LDB/STB,b等指令完成较为复杂的存储区访问和程序分支,学会使用条件码。
实验内容熟悉开发环境的使用并完成一块存储区的拷贝。
完成分支程序设计,要求判断参数,根据不同参数,调用不同的子程序。
实验要求(1)按照 2.3节介绍的方法,在ADS下创建一个工程asmab2,定义两个数据存储区Sr c和Dst,Src用于存放原字符串,Dst用于存放目的字符串。
山东大学操作系统实验报告4进程同步实验
计算机科学与技术学院实验报告int msq_id;if((msq_id = get_ipc_id("/proc/sysvipc/msg",msq_h)) < 0 ) { if((msq_id = msgget(msq_h,msq_flg)) < 0){perror("messageQueue set error");exit(EXIT_FAILURE);}}return msq_id;}实验结果:分析:多进程的系统中避免不了进程间的相互关系。
进程互斥是进程之间发生的一种间接性作用,一般是程序不希望的。
通常的情况是两个或两个以上的进程需要同时访问某个共享变量。
我们一般将发生能够问共享变量的程序段称为临界区。
两个进程不能同时进入临界区,否则就会导致数据的不一致,产生与时间有关的错误。
解决互斥问题应该满足互斥和公平两个原则,即任意时刻只能允许一个进程处于同一共享变量的临界区,而且不能让任一进程无限期地等待。
进程同步是进程之间直接的相互作用,是合作进程间有意识的行为,典型的例子是公共汽车上司机与售票员的合作。
只有当售票员关门之后司机才能启动车辆,只有司机停车之后售票员才能开车门。
司机和售票员的行动需要一定的协调。
同样地,两个进程之间有时也有这样的依赖关系,因此我们也要有一定的同步机制保证它们的执行次序。
信号量机制就是其中的一种。
信号灯机制即利用pv操作来对信号量进行处理。
PV操作由P操作原语和V 操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的值减1,即S=S-1;②如果S³0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
V(S):①将信号量S的值加1,即S=S+1;②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。
山东大学操作系统课程设计代码分析及设计实现及测试报告
操作系统课程设计报告班级:2012级软件工程8班团队成员:杨环张俊吴佩瑶王飞王梅瑞目录目录 (2)一、前期工作 (3)1.1 平台搭建 (3)二、代码分工 (3)三、设计及实现 (3)3.1 Task1.1 KThread.join() (3)3.1.1 要求分析 (3)3.1.2 设计方案 (4)3.1.3 实现代码 (4)3.1.4 测试代码及结果 (5)3.2 Task1.2 condition2 类 (7)3.2.1 要求分析 (7)3.2.2 设计方案 (7)3.2.3 实现代码 (7)3.2.4 测试代码及结果 (8)3.3 Task1.3 alram 类 (11)3.3.1 要求分析 (11)3.3.2 设计方案 (11)3.3.3 实现代码 (11)3.3.4 测试代码及结果 (12)3.4 Task1.4 communicator 类 (13)3.4.1 要求分析 (13)3.4.2 设计方案 (13)3.4.3 实现代码 (13)3.4.4 测试代码及结果 (14)3.5 Task1.5 priority scheduler 类 (17)3.5.1 要求分析 (17)3.5.2 设计方案 (17)3.5.3 实现代码 (17)3.5.4 测试代码及结果 (17)3.6 Task1.6 boat 类 (23)3.6.1 要求分析 (23)3.6.2 设计方案 (23)3.6.3 实现代码 (23)3.6.4 测试代码及结果 (30)3.7 Task2.1 系统调用creat, open, read, write, close, unlink (30)3.7.1 要求分析 (30)3.7.2 设计方案 (30)3.7.3 实现代码 (31)3.7.4 测试代码及结果 (34)3.8 Task2.2 多进程内存分配及访问 (34)3.8.1 要求分析 (34)3.8.2 设计方案 (34)3.8.3 实现代码 (35)3.8.4 测试代码及结果 (38)3.9 Task2.3 系统调用exec, join, exit (40)3.9.1 要求分析 (40)3.9.2 设计方案 (41)3.9.3 实现代码 (41)3.9.4 测试代码及结果 (43)3.10 Task2.4 Lottery Schedule 类 (43)3.10.1 要求分析 (43)3.10.2 设计方案 (44)3.10.3 实现代码 (44)3.10.4 测试代码及结果 (44)总结 (47)一、前期工作1.1 平台搭建Nachos For Java phrase1 部分:IDE 环境可采用Eclipse 。
山东大学计算机学院操作系统实验报告
操作系统课程设计报告学院:计算机科学与技术学院专业:计算机科学与技术班级:20**级*班姓名:***学号:20**********目录一实验平台 (2)二Project1建立线程系统 (2)Task1.1实现KThread.join() (2)1.要求 (2)2.分析 (2)3.方案 (3)4.实现代码 (3)Task1.2利用中断提供原子性,直接实现条件变量 (4)1.要求 (4)2.分析 (5)3.方案 (5)4.实现代码 (5)Task1.3实现waitUntil (7)1.要求 (7)2.分析 (7)3.方案 (7)4.实现代码 (8)Task1.4用条件变量,不使用信号量,实现同步发送接收消息,speak,listen (10)1.要求 (10)2.分析 (10)3.方案 (11)4.实现代码 (11)Task1.5完成PriorityScheduler实现优先级调度 (13)1.要求 (13)2.分析 (13)3.方案 (14)4.实现代码 (14)Task1.6 (17)1.要求 (17)2.分析 (18)3.方案 (19)4.实现代码 (19)三Project2多道程序设计 (27)Task2.1 (27)1.要求 (27)2.分析 (28)3.方案 (28)4.实现代码 (31)Task2.2 (36)1.要求 (36)2.分析 (36)3.方案 (36)4.实现代码 (38)Task2.3 (43)1.要求 (43)2.分析 (43)3.方案 (44)4.实现代码 (45)Task2.4 (47)1.要求 (47)2.分析 (48)3.方案 (48)4.实现代码 (48)一实验平台开发语言:Java开发工具:Eclipse Luna操作系统:Ubuntu14.04二P roject1建立线程系统Task1.1实现KThread.join()1.要求实现Implement KThread.join()函数。
山东大学汇编语言上机实验——实验五
子程序设计2.6显示学生名次表rank编制一个程序,要求接受键盘输入的一个班的学生成绩,并存放于一个50字的grade数组中,其中grade+i保存学号为I+1的学生成绩。
然后根据grade中的学生成绩,把学生成绩依次填入50字的rank数组中,其中rank+i的内容是学号为i+1的学生的名次。
再按学号顺序把名次从终端上显示出来。
本题要做的主要工作和例2.2的内容是完全一样的,只是增加了由用户键入学生成绩及输出学生名次两个部分的内容,因此这三个部分可以用子程序结构来完成。
子程序结构划分的层次图如图2.17所示,可以看出,main为主要模块,其下一层的三个模块为程序的三大部分。
现将各模块说明如下:1.模块名:main 为总模块输入:从键盘输入一个班的学生成绩输出:显示一个班的学生成绩功能:根据输入的学生成绩,计算并显示学生名次。
算法如下:一个学生名次等于成绩高于该学生的人数+1.2.模块名:input输入:以学号为序型键盘输入一个班的学生成绩。
各个成绩之间用逗号隔开,最后以回车符号结束。
输出:把一个班的学生成绩存入grade数组。
功能:接受一个班的学生成绩。
调用子模块decibin把键盘输入的一个十进制数转换为二进制数。
调用子模块crlf完成回车,换行功能。
3.模块名:rankp输入:从grade数组取得一个班的学生成绩。
输出:以学号为序计算出该班每个学生的名次存入rank数组。
功能:计算一个班的学生成绩。
算法为:一个学生的名次等于成绩高于该生的学生人数加1.4,。
模块名;output输入:把rank数组取得一个班的学生名次。
输出:把一个班的学生名次以学号为序在总端上显示出来。
功能:先是一个班的学生名次。
调用子模块decibin把键盘输入的一个十进制数转换为二进制数。
调用子模块crlf完成回车,换行功能。
5:模块名:decilin输入:从键盘输入一个十进制数。
输出:把该数转换成二进制数并存入BX寄存器中。
山东大学操作系统实验报告4进程同步实验
山东大学操作系统实验报告4进程同步实验计算机科学与技术学院实验报告实验题目:实验四、进程同步实验学号:日期:20120409 班级:计基地12 姓名:实验目的加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案了 Linux 系统 IPC进程同步工具的用法,练习并发协作进程的同步与互斥操作的编与调试技术实验内容抽烟者问题假设一个系统中有三个抽烟者进程每个抽烟者不断地卷烟并抽烟抽烟者卷起并抽掉一颗烟需要有三种材料烟草纸和胶水一个抽烟者有烟草一个有纸,另一个有胶水。
系统中还有两个供应者进程,它们无限地供应所有种材料但每次仅轮流提供三种材料中的两种。
得到缺失的两种材料的抽烟者卷起并抽掉一颗烟后会发信号通知供应者让它继续提供另外的两种材料。
这过程重复进行请用以上介绍 IPC同步机制编程实现该问题要求的功能硬件环境@CPUi3-2350MIntel?Cor42.30GHz MobileIntel?Sandybridgex86/MMX/SSE24G内存3操作系统:20.1 GB磁盘:软件环境:ubuntu13.04实验步骤:(1)新建定义了producer和consumer 共用的文件。
ipc.h函数原型和变量的IPC.(2)新建ipc.c文件,编写producer和consumer共用的IPC的具体相应函数。
(3)新建Producer文件,首先定义producer的一些行为,利用系统调用建立共享内存区域,设定其长度并获取共享内存的首地址。
然后设定生产者互斥与同步的信号灯,并为他们设置相应的初值。
当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他,当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。
(4)新建Consumer文件,定义consumer的一些行为,利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。
山东大学计算机学院操作系统实验报告
操作系统课程设计报告学院:计算机科学与技术学院专业:计算机科学与技术班级:20**级*班姓名:***学号:20**********目录一实验平台 (4)二Project1建立线程系统 (4)Task1.1实现KThread.join() (4)1.要求 (4)2.分析 (4)3.方案 (4)4.实现代码 (5)Task1.2利用中断提供原子性,直接实现条件变量 (6)1.要求 (6)2.分析 (6)3.方案 (7)4.实现代码 (7)Task1.3实现waitUntil (9)1.要求 (9)2.分析 (9)3.方案 (10)4.实现代码 (10)Task1.4用条件变量,不使用信号量,实现同步发送接收消息,speak,listen (12)1.要求 (12)2.分析 (12)3.方案 (13)4.实现代码 (13)Task1.5完成PriorityScheduler实现优先级调度 (16)1.要求 (16)2.分析 (16)3.方案 (17)4.实现代码 (17)Task1.6 (20)1.要求 (20)2.分析 (21)3.方案 (22)4.实现代码 (22)三Project2多道程序设计 (31)Task2.1 (31)1.要求 (31)2.分析 (31)3.方案 (32)4.实现代码 (35)Task2.2 (40)1.要求 (40)2.分析 (40)3.方案 (41)4.实现代码 (42)Task2.3 (48)1.要求 (48)2.分析 (49)3.方案 (49)4.实现代码 (50)Task2.4 (53)1.要求 (53)2.分析 (53)3.方案 (54)4.实现代码 (54)一实验平台开发语言:Java开发工具:Eclipse Luna操作系统:Ubuntu14.04二P roject1建立线程系统Task1.1实现KThread.join()1.要求实现Implement KThread.join()函数。
山东大学操作系统实验报告完整版
山东大学操作系统实验报告HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】操作系统实验报告计算机科学与技术学院目录一、进程控制实验实验目的加深对于进程并发执行概念的理解。
实践并发进程的创建和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创建、变换、撤销状态变换的过程。
掌握进程控制的方法,了解父子进程间的控制和协作关系。
练习 Linux 系统中进程创建与控制有关的系统调用的编程和调试技术。
示例实验实验内容以下实验示例程序应实现一个类似shell 子命令的功能,它可以从执行程序中启动另一个新的子进程并执行一个新的命令和其并发执行。
实验演示结果独立实验实验内容参考以上示例程序中建立并发进程的方法,编写一个父子协作进程,父进程创建一个子进程并控制它每隔 3 秒显示一次当前目录中的文件名列表。
实验步骤算法设计通过进程间的通讯,先创建一个父进程一个子进程,父进程沉睡3秒,子进程作为当前父进程再次创建一个他的子进程,当前子进程执行显示当前目录文件列表功能,执行execve()方法后死亡。
While(1)在死循环里无限进行当前操作。
即达到父进程创建一个子进程并控制它每隔3秒显示一次当前目录中的文件名列表的要求。
开发调试过程打开一终端命令行窗体,新建一个文件夹,在该文件夹中建立名为的C 语言程序;再建立以下名为的 C 语言头文件;建立项目管理文件 Makefile;输入 make 命令编译连接生成可执行的 pctl 程序;执行 pctl 程序;再次执行带有子进程指定执行命令的 pctl 程序。
思考与分析1.反映的进程的特征和功能,在真实的操作系统中是怎样实现和反映出教材中讲解的进程的生命期、进程的实体和进程状态控制的。
对于进程概念和并发概念有哪些新的理解和认识子进程是如何创建和执行新程序的答:进程是一个可并发执行的程序在某数据集上的一次运行,是程序的一次运行过程。
山东大学计算机组成原理实验五
微程序控制的存储器读写系统设计这是山东大学计算机组成原理课程设计的实验五,考虑到搜索这个实验的同学应该想要的都是图样和操作步骤,所以,设计目的,设计简述什么的就略去了。
不多说,直接开始。
首先打开程序,新建项目(new project),这个操作流程就不用说了吧;然后选择器件,1032E,70之类,不多说了。
打开菜单栏Source—new—Schematic—取名“add”—开始画下图:画好之后,生成元件符号(点击File菜单中的Matching Symbol,或者直接在做好的add文件上操作)。
打开菜单栏Source—new—Schematic—取名“add8”—开始画下图:画好之后,生成元件符号(点击File菜单中的Matching Symbol)。
这时候add应该在add8下方(层次化)。
打开菜单栏Source—new—Schematic—取名“count8”—开始画下图:这里要提一点,该元件用来当做uPC使用,是最简单的图,还有更加复杂的图,不过实际上对该实验基本无影响,所以此处采取最简单的方法,在末尾附有复杂图。
画好之后,生成元件符号(点击File菜单中的Matching Symbol)。
打开菜单栏Source—new—Schematic—取名“reg”—开始画下图:画好之后,生成元件符号(点击File菜单中的Matching Symbol)。
打开菜单栏Source—new—Schematic—取名“top_alu”—开始画下图:这是最顶层的设计,所以比较复杂,我截图的时候分成了两个,两个合在一起才是完整的图。
编写完毕后,“Fit Design”,若画图没有错误,选择的器件型号正确,那应该是显示成功的。
接下来,将该实验下载到实验板上,下载的时候,实验板应置于统调(开关向上,左上角八个灯亮着,即是统调)。
下载完毕后,将开关置于分调,输入以下指令:这里要使用实验板右下角的键盘,下面的数字对应实验台的数字(X表示随便一个数都可以)先输入指令:1 00 X41# 第一条指令XXXX01001 01 X21# 第二条指令XXXX00101 02 X11# 第三条指令XXXX0001输入数据:2 00 05 (05H,地址)2# 第一条指令000001012 01 55 (55H,数据)2# 第二条指令01010101输入完毕后,开关置于统调,按下RET2,然后按右下角的单脉冲,总共按三次。
山东大学操作系统试验报告
计算机科学与技术学院操作系统实验报告学院:专业:班级:姓名:学号:日期:Email:目录实验一进程控制实验 (4)1.1实验目的 (4)1.2实验题目 (4)1.3实验步骤 (4)1.4结论分析与体会 (5)1.5附录:本实验全部程序源代码及注释 (5)1.5.1Pctl.c (5)1.5.2pctl.h (9)1.5.3makefile (10)实验三进程调度算法实验 (10)3.1实验目的 (10)3.2实验题目 (11)3.3实验步骤 (11)3.4结论分析与体会 (12)3.5附录:本实验全部程序源代码及注释 (12)3.5.1Psched.c (12)3.5.2Psched.h (14)3.5.3Makefile (16)实验四进程同步实验 (16)4.1实验目的 (16)4.2实验题目 (16)4.3实验步骤 (17)4.4结论分析与体会 (24)4.5附录:本实验全部程序源代码及注释 (24)4.5.1Ipc.c (24)4.5.2Ipc.h (32)4.5.3Consumer (35)4.5.4Producer (41)4.5.5makefile (50)实验七内存页面置换算法实验 (51)7.1实验目的 (51)7.2实验题目 (51)7.3实验步骤 (52)7.4附录:本实验全部程序源代码及注释 (55)7.4.1Vmrp.h (55) (57)7.5.3makefile (73)实验八磁盘移臂调度算法实验 (74)7.2实验目的 (74)8.2实验题目 (74)8.3实验步骤 (75)8.4附录:本实验全部程序源代码及注释 (76)8.4.1Dask.h (76) (78)8.4.3Makefile (94)实验一进程控制实验1.1 实验目的加深对于进程并发执行概念的理解。
实践并发进程的创建和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创建、变换、撤销状态变换的过程。
山大自考强化实践能力培养实验五 邮件服务器配置
实验五邮件服务器配置一、配置POP3服务。
1.点击“开始”→“管理工具”→“POP3服务”,打开“POP3服务”窗口。
2.新建域。
在窗口左侧“POP3服务”下的本机主机名上右击,选择“新建”→“域”。
在弹出的“添加域”对话框中输入自己需要建立的邮件服务器的主机名,即邮箱地址中“@”后面的部分,如:。
点击“确定”按钮完成域的创建。
如下图:3.新建邮箱。
在窗口左侧选择刚刚创建好的新域,如,右击,选择“新建”→“邮箱”,在弹出的“添加邮箱”对话框中设置自己的邮箱。
如:邮箱名为fffgg,密码为uju。
点击“确定”按钮完成。
如果需要在本域下创建多个邮箱,则重复进行操作即可。
至此邮箱创建完毕。
如下图:二、配置SMTP服务。
1.选择“开始”→“管理工具”→“Internet信息服务(IIS)管理器”。
2.在“Internet信息服务(IIS)管理器”窗口的左侧选择“默认SMTP虚拟服务器”,右击,选择“属性”。
3.在“属性”对话框中的“常规”选项卡中,将IP地址设置为本邮件服务器的IP地址。
也可以对最大连接数和日志记录等进行设置,我们保持默认。
然后点击“确定”完成配置。
如下图:至此,我们已经用WindowsServer2003搭建好了一个简单的邮件服务器,下面的任务,就是用Outlook等邮件客户端工具来进行连接。
配置Outlook等客户端工具的方法如下1.打开OutlookExpress,添加一个新账户。
如下图:2.在“电子邮件地址”中填入之前设置的邮件地址,如:hhjj@。
如下图:3.在“电子邮件服务器”中进行设置,“接收邮件服务器”和“发送邮件服务器”处均填入邮件服务器的IP地址,如:123.444.333.22如下图:4.在“Internet邮件登陆”中填入之前设置的用户名和密码。
例如Aaron 设置的用户名和密码均为“ooo”。
另外,“使用安全密码验证登陆”一项一定要选中,否则在连接时会报错。
如下图:5.接下来,点击“完成”,就可以用新的邮件服务器收发邮件了。
山大操作系统课程设计
山大操作系统课程设计一、课程目标知识目标:1. 掌握操作系统的基本概念、功能、类型及发展历程;2. 理解进程与线程的区别与联系,掌握进程管理的基本方法;3. 了解内存管理的基本原理,掌握虚拟内存和分页/分段存储技术;4. 理解文件系统的工作原理,掌握文件的组织、存储和访问控制方法;5. 了解设备管理的基本原理,掌握I/O调度策略和中断处理机制。
技能目标:1. 能够编写简单的进程调度算法,分析其性能;2. 能够运用内存分配算法,解决内存碎片和内存不足问题;3. 能够设计简单的文件系统,实现对文件的基本操作;4. 能够分析设备管理策略,提高I/O设备的利用率;5. 能够运用所学知识解决实际操作系统相关问题。
情感态度价值观目标:1. 培养学生热爱操作系统学科,增强学习兴趣;2. 培养学生具备良好的团队协作精神和沟通能力;3. 培养学生具备严谨的科学态度和批判性思维;4. 培养学生关注我国操作系统发展,增强国家意识;5. 培养学生具备创新意识和实践能力,为我国计算机事业贡献力量。
课程性质:本课程为计算机科学与技术专业的核心课程,旨在使学生掌握操作系统的基本原理和实现方法,培养具备实际操作系统设计与开发能力的人才。
学生特点:学生已具备一定的计算机专业基础知识,具有较强的逻辑思维能力和动手实践能力。
教学要求:结合课本内容,注重理论与实践相结合,通过案例分析和实际操作,使学生能够深入理解操作系统的核心概念和关键技术。
同时,关注学生的情感态度价值观培养,提高其综合素质。
在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. 操作系统概述:介绍操作系统的基本概念、功能、类型和发展历程,对应课本第一章内容。
- 操作系统的定义和功能- 操作系统的类型与特点- 操作系统发展历程及现状2. 进程管理:讲解进程与线程的概念、进程调度算法、同步互斥等,对应课本第二章内容。
- 进程与线程的基本概念- 进程调度算法分析- 进程同步互斥机制3. 内存管理:介绍内存管理的基本原理、虚拟内存技术、分页分段存储等,对应课本第三章内容。
山西大学网络操作系统实验5
山西大学计算机与信息技术学院学生实验报告课程名称:网络操作系统姓名:张浩田专业:计算机科学与技术学号: 2014241027【实验步骤、过程】1.在Windows 2003上创建域控制器(域名sxu.local)并修改计算机名2.把一台xp虚拟机(计算机名改为xf1)作为客户机加入域3. 把另一台xp虚拟机(计算机名改为xf2)作为客户机加入域4.在域控制器上创建一个文件夹,里面随意放置一个文件,将该文件夹设置为共享,共享名设置为“考勤”5.在“xf1”虚拟机上创建一个文件夹,里面随意放置一个文件,将该文件夹设置为共享,共享名设置为“工作表”6. 在“xf2”虚拟机上创建一个文件夹,里面随意放置一个文件,将该文件夹设置为共享,共享名设置为“会议纪要”7.把域控制器中的共享文件夹发布到域中8.把客户机(xf1)中的共享文件夹发布到域中,并且通过“查找”功能查找到该文件夹9.把客户机(xf2)中的共享文件夹发布到域中,并且通过“查找”功能查找到该文件夹10.创建域账户域使用人员:网管1人(zhao)主任1人(qian)秘书1人(sun)工作人员2人(li、zhou)11.对各账户分配资源对资源的使用要求:完全管理网管考勤表,完全控制主任考勤表,只读网管、秘书、工作人员工作表,读+写秘书、工作人员中的li会议纪要,读+写主任、秘书12.创建组账户(主任,秘书,工作人员),类型为安全组—全局13.用户账户规划:用户账户密码隶属于说明Administrator 空Administrators 内置的最高管理员zhao abc,123 Domain Admins 赵网管qian abc,123 主任钱主任sun abc,123 秘书孙秘书li abc,123 工作人员李zhou abc,123 工作人员周14.访问域共享资源在客户机上用域帐户登录到域,用“网上邻居”访问各个共享资源,注意用不同帐户登录在资源访问上有什么不同,是否可以实现不同账户对不同网络资源的访问权限。
山东大学操作系统课设nachos
操作系统课程设计实验报告——对Nachos系统的完善班级:计软13.4分组:第八组Phase 0一、写在前面二、需要明确的是:Run nachos → ThreadKernel is called to create nachos kernel → initialize() initializes nachos kernel → selfTest() tests this kernel → run() is supposed to run user programs latterSome Crucial requirements:1. Only modify nachos.conf according to the project specifications.2. Do not modify any classes in the nachos.machine package, the nachos.ag package, or the nachos.security package.3. Do not add any new packages to your project.4.Do not modify the API for methods that the autograder uses.5.Do not directly use Java threads (the ng.Thread class).6. Do not use the synchronized keyword in any of your code.7. Do not directly use Java File objects (in the java.io package).Phase 1:Build a thread system for kernel processes Task 1.1Implements Join() method一、问题描述1. Note that another thread does not have to call join(), but if it is called, it must be called only once.2. A thread must finish executing normally whether or not it is joined.二、解决方案线程B在线程A运行的过程中调用join方法,阻塞线程A的运行获取运行权,此时线程A 等待线程B完成运行后重新运行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
进程同步实验张咪软件四班一、实验目的总结和分析示例实验和独立实验中观察到的调试和运行信息,说明您对与解决非对称性互斥操作的算法有哪些新的理解和认识?为什么会出现进程饥饿现象?本实验的饥饿现象是怎样表现的?怎样解决并发进程间发生的饥饿现象?您对于并发进程间使用消息传递解决进程通信问题有哪些新的理解和认识?根据实验程序、调试过程和结果分析写出实验报告。
二、实验要求理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。
此外还有一间等候室,可容纳13位顾客等候进入理发室。
顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。
在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。
顾客理完发后,可向任何一位理发师付款。
但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。
理发师在没有顾客的时候就坐在理发椅子上睡眠。
理发师的时间就用在理发、收款、睡眠上。
请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。
三、实验环境实验环境均为Linux操作系统,开发工具为gcc和g++。
四、实验思路约束:1.设置一个count变量来对顾客进行计数,该变量将被多个顾客进程互斥地访问并修改,通过一个互斥信号量mutext来实现。
count>20时,就不进入理发店。
7<count<20时,count++,顾客申请等候室,进入等候室等待,用一个room信号量控制。
然后等待申请沙发,用一个sofa信号量控制。
然后申请椅子。
3<count<7时,count++,顾客坐在沙发上等待,等待申请椅子。
count<3时,count++,顾客坐在椅子上等待理发。
2.只有在理发椅空闲时,顾客才能做到理发椅上等待理发师理发,否则顾客便必须等待;只有当理发椅上有顾客时,理发师才可以开始理发,否则他也必须等待。
可通过信号量empty 和full来控制。
3.理发师为顾客理发时,顾客必须等待理发的完成,并在理发完成后理发师唤醒他,使用一个信号量finish来控制;4.顾客理完发后必须向理发师付费,并等理发师收费后顾客才能离开;而理发师则需等待顾客付费,并在收费后唤醒顾客以允许他离开,这可分别通过两个信号量payment和receipt 来控制。
初值:计数int count=0信号量empty=3;full=0;room=13;sofa=4;finish=0;pay=0;receipt=0;mutex=1;理发师进程while(1){wait(full); //等待理发椅上有顾客剪头发signal(finish); //通知顾客理发完成wait(pay); //等待顾客付费wait(mutex);//在任一时刻只能记录一个顾客的付款收费signal(mutex);signal(receipt); //通知顾客收费完毕}顾客进程wait(mutex); //count既用于判断,也要修改,所以为临界资源,用mutex管理互斥if(count>20) {//顾客大于20人signal(mutex);离开理发店}else{//顾客小于20人count=count+1;//进入理发店if(count>7) { //count>7,说明理发椅和沙发上都有人,需要到等待室等待signal(mutex);wait(room);//申请进入等待室在等待室等wait(sofa); //申请沙发signal(room);//释放等待室坐在沙发上等wait(empty);//等待理发椅为空申请到理发椅signal(sofa); //释放沙发}else if(count>3){//说明理发椅上都有人,需要坐到沙发上等待signal(mutex);wait(sofa);//申请沙发坐在沙发上等wait(empty);//等待理发椅为空申请到理发椅signal(sofa);//释放沙发}else{//count<3,可以坐到理发椅上等待signal(mutex);wait(empty); //申请理发椅}坐在理发椅上等待理发signal(full); //通知理发师开始理发理发wait(finish); //等待理发完毕付款signal(payment); //通知理发师已付款wait(receipt); //等待理发师收款理发师收费完成,顾客离开理发椅signal(empty); //释放理发椅wait(mutex); //对count 临界资源操作,用mutex完成互斥count=count-1; //离开理发店signal(mutex);}七、调试及实验结果1、创建makefile文件hdrs = ipc.hopts = -g -cc_src = cons.c ipc.cc_obj = cons.o ipc.op_src = bar.c ipc.cp_obj = bar.o ipc.oall: producer consumerconsumer: $(c_obj)gcc $(c_obj) -o consumercons.o: $(c_src) $(hdrs)gcc $(opts) $(c_src)producer: $(p_obj)gcc $(p_obj) -o producerbar.o: $(p_src) $(hdrs)gcc $(opts) $(p_src)clean:rm cons bar *.o2.执行make命令,结果出现了许多由于粗心造成的编译错误3、修改程序后编译成功,打开两个终端,先运行producer.c,再运行consumer.c4、若按ctrl+c停止producer进程,则出现如下图结果。
沙发坐满后顾客将进入等候室等待5、若再次执行producer进程,将陆续唤醒在等待的顾客,结果如下图6、若再停止producer,让等待室的人也满,则顾客会离开理发店,结果如下图七、心得与收获1、本次试验,使我基本掌握了怎样用消息队列控制和堵塞进程,实现对共享内存的有序访问。
2、msgrcv/msgsnd为linux系统中异步或进程间通信的一种机制,msgrcv()可以从消息队列中读取消息,msgsnd()将一个新的消息写入队列。
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); msgflg:这个参数依然是是控制函数行为的标志,取值可以是:0,表示忽略;IPC_NOWAIT,如果消息队列为空,则返回一个ENOMSG,并将控制权交回调用函数的进程。
3、不仅加深了对进程互斥的理解,还使我加深了对理发师算法的理解,找到了它与读者写者问题的共同之处:(1).进程间的互斥(2).理发师类似读者进程,顾客类似写者进程。
4、编写程序时要细心,对于编译过程中出现的错误,要有耐心去解决。
八、源代码Ipc.h:#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/sem.h>#include <sys/msg.h>#define BUFSZ 256#define MAXVAL 100#define STRSIZ 8#define WRITERQUEST 1#define READERQUEST 2#define FINISHED 3//写请求标识//读请求标识//读写完成标识typedef union semuns { int val;} Sem_uns;typedef struct msgbuf { long mtype;int mid;} Msg_buf;//信号量key_t costomer_key; int costomer_sem;key_t account_key;int account_sem;int sem_val;int sem_flg;//消息队列int wait_quest_flg;key_t wait_quest_key; int wait_quest_id;int wait_respond_flg;key_t wait_respond_key;int wait_respond_id;int sofa_quest_flg;key_t sofa_quest_key;int sofa_quest_id;int sofa_respond_flg;key_t sofa_respond_key;int sofa_respond_id;int get_ipc_id(char *proc_file,key_t key);char *set_shm(key_t shm_key,int shm_num,int shm_flag); int set_msq(key_t msq_key,int msq_flag);int set_sem(key_t sem_key,int sem_val,int sem_flag);int down(int sem_id);int up(int sem_id);Ipc.c:#include "ipc.h"int get_ipc_id(char *proc_file,key_t key) {FILE *pf;int i,j;char line[BUFSZ],colum[BUFSZ];if((pf = fopen(proc_file,"r")) == NULL){ perror("Proc file not open");exit(EXIT_FAILURE);}fgets(line, BUFSZ, pf);while(!feof(pf)){i = j = 0;fgets(line, BUFSZ,pf);while(line[i] == ' ') i++;while(line[i] !=' ') colum[j++] = line[i++]; colum[j] = '\0';if(atoi(colum) != key) continue;j=0;while(line[i] == ' ') i++;while(line[i] !=' ') colum[j++] = line[i++]; colum[j] = '\0';i = atoi(colum);fclose(pf);return i;}fclose(pf);return -1;}int down(int sem_id){struct sembuf buf;buf.sem_op = -1;buf.sem_num = 0;buf.sem_flg = SEM_UNDO;if((semop(sem_id,&buf,1)) <0) { perror("down error ");exit(EXIT_FAILURE);}return EXIT_SUCCESS;}int up(int sem_id){struct sembuf buf;buf.sem_op = 1;buf.sem_num = 0;buf.sem_flg = SEM_UNDO;if((semop(sem_id,&buf,1)) <0) {perror("up error ");exit(EXIT_FAILURE);}return EXIT_SUCCESS;}int set_sem(key_t sem_key,int sem_val,int sem_flg){int sem_id;Sem_uns sem_arg;//测试由sem_key 标识的信号灯数组是否已经建立if((sem_id = get_ipc_id("/proc/sysvipc/sem",sem_key)) < 0 ) {//semget 新建一个信号灯,其标号返回到sem_idif((sem_id = semget(sem_key,1,sem_flg)) < 0){perror("semaphore create error");exit(EXIT_FAILURE);//设置信号灯的初值sem_arg.val = sem_val;if(semctl(sem_id,0,SETVAL,sem_arg) <0){perror("semaphore set error");exit(EXIT_FAILURE);}}return sem_id;}char * set_shm(key_t shm_key,int shm_num,int shm_flg){int i,shm_id;char * shm_buf;//测试由shm_key 标识的共享内存区是否已经建立if((shm_id = get_ipc_id("/proc/sysvipc/shm",shm_key)) < 0 ){//shmget 新建一个长度为shm_num 字节的共享内存,其标号返回到shm_idif((shm_id = shmget(shm_key,shm_num,shm_flg)) <0)perror("shareMemory set error");exit(EXIT_FAILURE);}//shmat 将由shm_id 标识的共享内存附加给指针shm_bufif((shm_buf = (char *)shmat(shm_id,0,0)) < (char *)0){perror("get shareMemory error");exit(EXIT_FAILURE);}for(i=0; i<shm_num; i++) shm_buf[i] = 0; //初始为0}//shm_key 标识的共享内存区已经建立,将由shm_id 标识的共享内存附加给指针shm_bufif((shm_buf = (char *)shmat(shm_id,0,0)) < (char *)0){perror("get shareMemory error");exit(EXIT_FAILURE);}return shm_buf;}int set_msq(key_t msq_key,int msq_flg){int msq_id;//测试由msq_key 标识的消息队列是否已经建立if((msq_id = get_ipc_id("/proc/sysvipc/msg",msq_key)) < 0 ) {//msgget 新建一个消息队列,其标号返回到msq_idif((msq_id = msgget(msq_key,msq_flg)) < 0){perror("messageQueue set error");exit(EXIT_FAILURE);}}return msq_id;}Bar.c:#include "ipc.h"int main(int argc,char *argv[]){// int i;int rate;Msg_buf msg_arg;//可在在命令行第一参数指定一个进程睡眠秒数,以调解进程执行速度if(argv[1] != NULL) rate = atoi(argv[1]);else rate = 3;//一个请求消息队列wait_quest_flg = IPC_CREAT| 0644;wait_quest_key = 101;wait_quest_id = set_msq(wait_quest_key,wait_quest_flg);//一个响应消息队列wait_respond_flg = IPC_CREAT| 0644;wait_respond_key = 102;wait_respond_id = set_msq(wait_respond_key,wait_respond_flg);//一个请求消息队列sofa_quest_flg = IPC_CREAT| 0644;sofa_quest_key = 201;sofa_quest_id = set_msq(sofa_quest_key,sofa_quest_flg);//一个响应消息队列sofa_respond_flg = IPC_CREAT| 0644;sofa_respond_key = 202;sofa_respond_id = set_msq(sofa_respond_key,sofa_respond_flg);//信号量使用的变量costomer_key = 301;//顾客同步信号灯键值account_key = 302;//账簿互斥信号灯键值sem_flg = IPC_CREAT | 0644;//顾客同步信号灯初值设为0sem_val = 0;//获取顾客同步信号灯,引用标识存costomer_semcostomer_sem = set_sem(costomer_key,sem_val,sem_flg);//账簿互斥信号灯初值设为1sem_val = 1;//获取消费者同步信号灯,引用标识存cons_semaccount_sem = set_sem(account_key,sem_val,sem_flg);int pid1, pid2;pid1=fork();if(pid1==0) {while(1) {// wait_quest_flg=IPC_NOWAIT;printf("%d号理发师睡眠\n", getpid());wait_quest_flg=0;/*msgrcv()可以从消息队列中读取消息,msgsnd()将一个新的消息写入队列msgtyp等于0 则返回队列的最早的一个消息。