版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验四 Linux进程间通信一. 实验目的加深对操作系统进程间通信机制的理解,掌握利用管道、共享内存、消息通信和信号量集等机制实现进程间通信的程序设计技术。二. 实验指导在多任务计算机系统中,每个进程都具有自己独立的全局变量和局部变量,子进程几乎完全独立于创建它的进程。进程之间交换信息需要借用操作系统内核提供的进程间通信(IPC)机制来实现。常见的进程间通信方法有:共享内存、信号量、管道/命名管道、消息队列、套接口和全双工管道等。前5种只适应于处于同一台主机的本地进程间通信,后2种方式还适应于运行在2台不同计算机系统上的两个进程间通信。Linux系统提供了一组系统调用作为用户使用其进程间通信机
2、制的接口。(一) 管道通信系统调用1文件锁定系统调用函数说明:#include unistd.hint lockf(int files, int function, long size);其中:files是文件描述符;function是锁定和解锁:1表示锁定,0表示解锁。size是锁定或解锁的字节数,为0,表示从文件的当前位置到文件尾。2. 创建无名管道系统调用函数说明: #include #inlcude int pipe(int filedes2);执行系统调用后,filedes1是管道写入端,filedes0是管道读出端。(二) 消息通信系统调用1. 创建消息队列系统调用msgget(
3、) 函数说明:#include#include#includeint msgget(key_t key, int flag);参数说明:key 用户指定的消息队列的名字;flag 用户设置的标志和访问方式。如 IPC_CREAT |0666 如果该队列已经存在,存在则返回该消息队列描述符,不存在则创建一个新的消息队列。2. 发送消息系统调用向指定的消息队列发送一个消息,并将该消息链接到该消息队列的尾部。函数说明:#include #include #include int msgsnd(int msgqid, struct msgbuf * msgp, int size, int flag);
4、其中msgqid是返回消息队列的描述符;msgp是指向用户消息缓冲区的一个结构体指针,size指示由msgp指向的数据结构中字符数组的长度。缓冲区中包括消息类型和消息正文,即: struct msgbuf long mtype; /*消息类型*/ char mtext ; /*消息的文本*/3. 消息接收系统调用从指定的消息队列中接收一个指定类型的消息, 并从消息队列中删除此消息。消息队列没有消息则等待。函数说明: #include #include #include int msgrcv(int msgqid, struct msgbuf *msgp, int size, int type,
5、 int flag);其中,msgqid,msgp,size,flag与msgsnd中的对应参数相似,type是规定要接收的消息类型。根据type的不同接收消息有3种方式:type=0,接收该队列的第一个消息,并将它返回给调用者;type为正整数,接收类型type的第一个消息;type为负整数,接收小于等于type绝对值的最低类型的第一个消息。4. 消息队列控制系统调用消息队列控制函数,用于读取消息队列的状态信息并进行修改,如查询消息队列描述符、修改它的许可权及删除该队列等。函数格式: #include #include #include int msgctl(int msgqid, int
6、cmd, struct msgqid_ds *buf); int msgqid,cmd; struct msgqid_ds *buf;其中,函数调用成功时返回0,不成功则返回-1。buf是用户缓冲区地址,供用户存放控制参数和查询结果;cmd是规定的命令,命令可分三类:(1)IPC_STAT。查询有关消息队列情况的命令。如查询队列中的消息数目、队列中的最大字节数、最后一个发送消息的进程标识符、发送时间等;(2)IPC_SET。按buf指向的结构中的值,设置和改变有关消息队列属性的命令。如改变消息队列的用户标识符、消息队列的许可权等;(3)IPC_RMID。消除消息队列的标识符。(三) 共享内存通
7、信系统调用1. 创建、检索一个共享存储区函数格式:#include#include#include int shmget(key_t key, int size, int flag); 其中,key是共享存储区关键字;size是其大小(以字节计);flag是用户设置的标志:IPC_CREAT表示若系统中尚无指名的共享存储区,则由核心建立一个共享存储区;若系统中已有共享存储区,返回存在的共享内存区标识符。2. 获得共享内存区虚拟地址 从逻辑上将一个共享存储区附接到进程的虚拟地址空间上。函数格式:#include#include#include char *shmat(int shmid, cha
8、r *addr, int flag);其中,shmid是共享存储区的标识符;addr是用户给定的,将共享存储区附接到进程的虚地址空间,其值为0时,由系统分配共享内存的虚拟内存地址;flag规定共享存储区的读、写权限,以及系统是否应对用户规定的地址做舍入操作,SHM_RDONLY表示只读,0表示可读写。该系统调用的返回值是共享存储区所附接到的进程虚拟地址viraddr。3. 断开共享内存的进程虚拟地址把一个共享存储区从指定进程的虚地址空间断开。函数格式:#include#include#include int shmdt(char *addr);其中,addr是要断开连接的虚地址,亦即以前由连接
9、的系统调用shmat( )所返回的虚地址。调用成功时,返回0值,调用不成功,返回-1。4. 共享存储区的控制读取和修改共享内存区域的状态。函数格式:#include#include#include int shmctl(int shmid, int cmd, struct shmid_ds *buf); int shmid,cmd; struct shmid_ds *buf;其中,buf是用户缓冲区地址,cmd是操作命令。命令可分为多种类型:(1)用于查询有关共享存储区的情况。如其长度、当前连接的进程数、共享区的创建者标识符等;(2)用于设置或改变共享存储区的属性。如共享存储区的许可权、当前连
10、接的进程计数等;(3)对共享存储区的加锁和解锁命令;(4)删除共享存储区标识符等。上述的查询是将shmid所指示的数据结构中的有关成员,放入所指示的缓冲区中;而设置是用由buf所指示的缓冲区内容来设置由shmid所指示的数据结构中的相应成员。(四) 信号量系统调用1. 信号量集合的创建与检索系统创建与检索信号量集合。函数格式:#include#include#include int semget(key_t key, int nsems, int semflag);其中,Key: IPC_PRIVATE时,关键字由系统选择;nsems : 信号量集中信号量的个数;semflags: 指定信号量
11、的访问权限和操作模式,取值:0 xyz: 低3位8进制数与文件权限一致 IPC_CREAT(00001000): 创建新的信号量集合,或返回已存在的信号量集 IPC_CREAT(00002000):检索信号量集合2. 信号量集操作函数格式:#include#include#include int semop(int semid, struct sembuf *sops, unsigned nops);其中,semid: 信号量集合;sops : 信号量操作参数;nops:本次操作的信号量个数;参数类型struct sembuf的定义如下:struct sembuf short sem_num;
12、 /信号灯编号,从0开始 short sem_op; /信号灯操作数,对应信号灯增加或减少该值 short sem_flg; /操作标志,通常为0。为IPC_NOWAIT时,信号量操作结果为负值也不阻塞 sem_op0: 释放资源,实施V操作,semval加sem_op sem_op=0: 则semval0,继续执行, semval!=0, 则阻塞,加入等待队列三. 实验内容与步骤1. 无名管道实验编写程序unnamed_pipe.c实现进程的管道通信。用系统调用pipe( )建立一个无名管道,在创建2个子进程P1和P2。然后让2个子进程P1和P2分别向管道各写一句话: Child 1 is
13、sending a message! Child 2 is sending a message!父进程从管道中读出2个来自子进程的信息并显示。 unnamed_pipe.c的参考程序请见附录4。2. 命名管道实验修改unnamed_pipe.c无名管道通信程序,改造成2个程序client.c和server.c,2个进程之间通过命名管道通信。运行client 2次,产生2个client进程,分别向管道写一句话: Child 1 is sending a message!Child 2 is sending a message!server进程从管道读出子进程发送的信息并显示。3. 消息通信实验1
14、)使用消息通信机制编写消息发送和接收的程序,2个进程间传送文本串信息。消息发送程序是msg_client.c,消息接收程序是msg_server.c。msg_client.c的参考程序请见附录4。msg_server.c的参考程序请见附录4。2)修改消息通信程序msg_server.c和msg_client.c,在2个进程之间传递消息正文为随机数的消息。提示:可将产生的随机数转换成字符串后写入消息正文发送,方法如下: sscanf(msg.mtext, “%6d”, rand();4. 共享内存实验1)编写程序shmem.c,该程序产生2个子进程server和client,并以共享内存方式传递
15、整数值。Client向server传递一些整数值,如传递整数1到9,要求两个进程实现同步。shmem.c的参考程序见附录4。2) 编写共享内存通信程序father.c, child.c和semaphore.c。运行father.c产生father进程,从标准输入读入一行文本串,写入共享内存;运行child.c产生child进程,从通信内存读取文本串并从终端显示。semaphore.c利用Linux的信号量集机制实现信号量和P、V操作函数,2个进程通过P、V操作实现同步。father.c、child.c和semaphore.c的参考程序请见附录4。3) 改写father.c和child.c程序,实现生产者消费者问题,生产者程序为proucer.c,消费者程序为consumer.c,缓冲区为一个共享内存,2个进程共同实现一个文本文件shmem.c的读入与显示。producer进程每次从shmem.c读入一行文本到共享内存区,consumer进程从共享内存去读出文本显示,2个进程使用信号灯和P、V操作实现同步。四. 实验报告1. 命名管道实验:写出程序unnamed_pipe.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年荆州市产业投资发展集团有限公司第二批社会公开招聘笔试备考试题及答案解析
- 2026年西安纺织集团有限责任公司人员招聘考试题库及答案详解
- 2026年玻璃保温容器制造行业市场准入研究报告及未来五至十年供应链韧性与安全
- 2026年其他运输设备修理行业产业趋势报告及未来五至十年市场空间与盈利前景
- 2026年珠海公共交通运输集团有限公司人员招聘考试备考题库及答案详解
- 2026年其他机械和设备修理业行业发展趋势报告及未来五至十年产业升级与格局演变
- 2026年上海联和投资有限公司人员招聘考试参考试题及答案详解
- 2026年金属门窗制造行业消费行为研究报告及未来五至十年降本增效与利润率修复
- 2026年国网陕西省电力有限公司人员招聘笔试参考题库及答案详解
- 2026年金属船舶制造行业分析报告及未来五至十年竞争格局分析
- JJF 1069-2026法定计量检定机构考核规范
- 2026广播电视播音员主持人考试题库及答案
- 2026-2027学年高三第一次联考(月考)试卷地理+答案
- T/CI 874-2025红树林精准生态修复与成效评估技术规程
- 湖南九校联盟2027届高三上学期第一次联考化学(含答案)
- 第12课 历史性成就 第1课时 课件(内嵌视频)2026-2027学年道德与法治五年级上册统编版
- 医疗机构麻醉药品和精神药品管理规定2026解读
- CSCO肾癌诊疗指南2026
- 【新教材】2026年秋人教版(PEP)五年级上册英语全册教案(含教学计划)
- 2026秋教科版(新教材)小学科学六年级上册(全册)分层作业及答案附目录p149
- DLT 572-2021 电力变压器运行规程
评论
0/150
提交评论