《2022年操作系统实验四》由会员分享,可在线阅读,更多相关《2022年操作系统实验四(5页珍藏版)》请在金锄头文库上搜索。
1、1 青 岛 理 工 大 学课程实验报告课程名称操作系统班级软件 114 实验日期2013/10/28 姓名李晓菲学号201107286 实验成绩实验名称实验 4 进程通信实验目的及要求1、加深理解进程通信的方法与原理;2、掌握如何利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通信。实验环境Windows; Virtual Box ;Ubuntu 11.10;Vi 编辑器;GCC 编译器;Geany IDE; 实验内容1、 了解系统调用pipe()、 msgget() 、 msgsnd() 、 msgrcv() 、 msgctl()、 shmget() 、shmat() 、shmdt()
2、 、shmctl()的功 能和实现过程。2、编写一 C语言程序,使其用管道来实现父子进程间通信。子进程向父进程发送字符串“ is sending a message to parent!”;父进程则从管道中读出子进程发来的消息,并将其显示到屏幕上,然后终止。3、运行该程序,观察、记录并简单分析其运行结果。算法描述及实验步骤1、pipe()、msgget()、msgsnd()、msgrcv()、msgctl() 、shmget()、shmat()、shmdt()、shmctl() (1) pipe( ) 系统调用格式:pipe(filedes)参数定义int pipe(filedes); int
3、 filedes2; 其中, filedes1是写入端, filedes0是读出端。该函数使用头文件如下:#include #inlcude #include 功能 : 建立一无名管道。 管道建立后, 写进程将数据写入文件filedes1,读进程从文件filedes0中读数据,从而实现读/ 写进程的管道通信。管道是一个共享资源,写/ 写进程、读 / 写进程应互斥使用管道。(2) msgget( ) 系统调用格式:int msgget(key_t key, int msgflg);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名
4、师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - 2 算法描述及实验步骤功能 : 获取与某个键关联的消息队列标识。消息队列被建立的情况有两种:(1)如果键的值是IPC_PRIVATE 。(2)或者键的值不是IPC_PRIVATE ,并且键所对应的消息队列不存在,同时标志中指定IPC_CREAT 。该函数使用头文件如下:#include #include #include (3、 4)msgsnd( ) 和 msgrcv( )系统调用格式int msgsnd(int msqid, const void *msgp, size_t msgsz, i
5、nt msgflg); ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); 功能 :在消息队列上进行收发消息。为了发送消息,调用进程对消息队列必须有写权限。接收消息时必须有读权限。该函数使用头文件如下:#include #include #include (5) msgctl( )系统调用格式int msgctl(int msqid, int cmd, struct msqid_ds *buf); 功能 :在指定的消息队列上执行某种控制操作。该函数使用头文件如下:#include #incl
6、ude #include (6)shmget( ) 功能: 用于创建(或者获取)一个由key 键值指定的共享内存对象,返回该对象的系统标识符:shmid;系统调用格式:shmid=shmget(key,size,flag)该函数使用头文件如下:#include #include #include 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - 3 算法描述及实验步骤(7)shmat( ) 功能 :共享存储区的附接。从逻辑上将一个
7、共享存储区附接到进程的虚拟地址空间上。用于建立调用进程与由标识符shmid 指定的共享内存对象之间的连接。系统调用格式:virtaddr=shmat(shmid,addr,flag)该函数使用头文件如下:#include #include #include (8)shmdt( ) 功能: 用于断开调用进程与共享内存对象之间的连接, 成功时返回0, 失败返回-1 。系统调用格式:int shmdt(shmaddr) char *shmaddr;/*采用 shmat 函数的返回值 */ (9)shmctl( ) 功能 :共享存储区的控制,对其状态信息进行读取和修改。用于对已创建的共享内存对象进行查
8、询、设置、删除等操作。系统调用格式:shmctl(shmid,cmd,buf)该函数使用头文件如下:#include #include #include 2、步骤:(1)定义进程变量(2)定义两个字符数组(3)创建管道(4)如果进程创建不成功,则空循环(5)如果子进程创建成功,pid 为进程号(6)锁定管道(7)给 Outpipe 赋值(8)向管道写入数据(9)等待读进程读出数据(10)解除管道的锁定(11)结束进程等待子进程结束(12)从管道中读出数据(13)显示读出的数据(14)父进程结束创建 jincheng.c 名师资料总结 - - -精品资料欢迎下载 - - - - - - - -
9、- - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - 4 调试过程及实验结果插入文字运行:运行后:总结(对实验结果进行分析,问题回答,实验心得体会及改进意见)虽然对pipe()、msgget()、msgsnd()、 msgrcv()、msgctl() 、shmget()、shmat()、shmdt()、 shmctl()的功能和实现过程有所了解,但是运用还是不熟练,过去没见过,所以运行了一个简单的程序。利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通信,加深了对其了解。(1)管道通信机制,同步的实现
10、过程:当写进程把一定数量的数据写入pipe,便去睡眠等待, 直到读进程取走数据后,再把它唤醒。 当读进程读一空pipe 时,也应睡眠等待,直到写进程将数据写入管道后,才将之唤醒,从而实现进程的同步。管道通信的特点:A 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - 5 总结两个管道;B. 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);C.单独构成一种独立
11、的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。D. 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。管道适用于处理大量的同步操作问题。(2)消息队列的特点:A.消息队列机制增加了管理的负担B.消息队列通信机制非常快捷C.消息队列机制是异步信息处理,不是实时的(3)共享存储区通信:为了传输大量数据,在存储区中划出了一块共享存储区,诸进程便可通过对共享存储区中数据的读或写来实现通信。附录(源程序清单)
12、#include #include #include int pid; / 定义进程变量main( ) int fd2; char OutPipe300, InPipe300; / 定义两个字符数组pipe(fd); / 创建管道while (pid = fork( ) = -1); / 如果进程创建不成功,则空循环if (pid = 0) / 如果子进程创建成功,pid 为进程号lockf(fd1, 1, 0); / 锁定管道sprintf(OutPipe, Childs PID=%dn%s,getpid(),is sending a message to parent!n); / 给 Ou
13、tpipe 赋值write(fd1, OutPipe, 50); / 向管道写入数据sleep(5); / 等待读进程读出数据lockf(fd1, 0, 0); / 解除管道的锁定exit(0); / 结束进程 else wait(0); / 等待子进程结束read(fd0, InPipe, 50); / 从管道中读出数据printf(%sn, InPipe); / 显示读出的数据exit(0); / 父进程结束 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -