2022年操作系统实验 .pdf
《2022年操作系统实验 .pdf》由会员分享,可在线阅读,更多相关《2022年操作系统实验 .pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、操作系统实验1 实验五进程通信一目的和要求学习如何利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通信,并加深对上述通信机制的理解。二实验内容1、了解系统调用 pipe( ),msgget( ), msgsnd( ),msgrcv( ), msgctl( ), shmget( ), shmat( ), shmdt( ), shmctl( )的功能和实现过程。2、利用 pipe( ) 等系统调用编写一段程序,并发进程间通过管道实现数据传送。3、利用 msgget( )、msgsnd( )、msgrcv( )、msgctl( )等系统调用编写一段程序,实现并发进程间消息的发送和接收。4、利用
2、 shmget( )、shmat( )、shmdt( )、shmctl( )等系统调用编写一段程序,并发进程间通过共享存储区实现数据传送。三实验提示一般来讲,在完整安装的 Linux 系统下,/usr/src/linux目录下的文件就是内核源码。另外,还可以从Internet上下载, http:/www.kernel.org/是比较权威的下载站点。任务 1:了解系统调用 pipe( ),read( ),write( ),msgget( ), msgsnd( ),msgrcv( ), msgctl( ), shmgt( ), shmat( ), shmdt( ), shmctl( )的功能和实现
3、过程。任务 2:并发进程间通过管道实现数据传送所谓管道,是指能够连接写进程和读进程的、并允许它们以生产者消费者方式进行通信的一个共享文件,又称为pipe 文件。由写进程从管道的写入端将数据写入管道,而读进程则从管道的读出端读出数据。管道分有名管道和无名管道。无名管道是利用pipe( )建立起来的一个无名的临时文件,只用该系统调用所返回的文件描述符来标识该文件,故只有创建管道的进程及其子孙进程才能识别此文件描述符,才能利用该文件(管道)进行通信。程序说明:父进程准备好读、写缓冲区,创建一个无名管道;父进程分别创建两个子进程;每个子进程通过管道向父进程传送一个(50 字符以内的 ) 字符串,然后结
4、束;父进程等待子进程传来的数据,从管道中接收到数据后,将字符串从屏幕上显示出来,然后结束。涉及到的系统调用:1、pipe( ) 系统调用格式名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 操作系统实验2 pipe(filedes) 参数定义int pipe(filedes); int filedes2; 其中, filedes1是写入端, filedes0是读出端。该函数使用头文件如下:#include #inlcude #i
5、nclude 功能:建立一无名管道。管道建立后,写进程将数据写入文件filedes1,读进程从文件 filedes0中读数据,从而实现读 / 写进程的管道通信。管道是一个共享资源,写/ 写进程、读 / 写进程应互斥使用管道。 2 、read( )/*Windows 中的 C语言也有此函数 */ 系统调用格式 read(fd,buf,nbyte) 功能: 从 fd 所指示的文件中读出nbyte 个字节的数据,并将它们送至由指针buf所指示的缓冲区中。如果该文件被加锁,则等待,直到锁打开为止。参数定义 int read(fd,buf,nbyte); int fd; char *buf; unsig
6、ned nbyte; 3、write( ) /*Windows 中的 C语言也有此函数 */ 系统调用格式 write(fd,buf,nbyte) 功能:把 nbyte 个字节的数据, 从 buf 所指向的缓冲区写到由fd 所指向的文件中。如果文件被加锁,则暂停写入,直至开锁。参数定义 同 read( ) 。编写、运行程序,观察运行结果,并分析。任务 3:利用 msgget( ) 、msgsnd( ) 、msgrcv( ) 、msgctl( )等系统调用编写两个程序client.c和 server.c ,分别用于消息的发送和接收。server 建立一个 key 为 75的消息队列,等待其它进程
7、发来的消息。当遇到类型为1 的消息,则作为结束信号,取消该队列,并退出server 。server 每接收到一个消息后显示一句“ (server)received” 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - 操作系统实验3 client使用 key 为 75 的消息队列, 先后发送类型从 10 到 1 的消息,然后退出。最后一个消息,即是server 端需要的结束信号。 client每发送一条消息后显示一句“(clie
8、nt)sent” 。server.c参考程序如下:#include #include #include #include #include #define MSGKEY 75 struct msgform long mtype; char mtext1000; msg; int msgqid; void server() msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*创建 75#消息队列 */ do msgrcv(msgqid,&msg,1030,0,0); /*接收消息 */ printf(server)receivedn); while(msg.mtype
9、!=1); msgctl(msgqid,IPC_RMID,0); /*删除消息队列,归还资源 */ exit(0); main() server(); client.c参考程序如下:#include #include #include #include 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - 操作系统实验4 #include #define MSGKEY 75 struct msgform long mtype; ch
10、ar mtext1000; msg; int msgqid; void client() int i; msgqid=msgget(MSGKEY,0777); /*打开 75#消息队列 */ for(i=10;i=1;i-) msg.mtype=i; printf(client)sentn); msgsnd(msgqid,&msg,1024,0); /*发送消息 */ exit(0); main() client(); 将上述两个程序分别编译为server 和 client,并按以下方式执行:./server & ipcs q ./client Client和 server 分别发送和接收了1
11、0条消息。观察运行结果, 注意发送方发送消息和接收方接收消息的顺序。涉及到的系统调用:1、msgget( ) 系统调用格式int msgget(key_t key, int msgflg); 功能:获取与某个键关联的消息队列标识。消息队列被建立的情况有两种:(1)如果键的值是 IPC_PRIVATE 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - 操作系统实验5 (2)或者键的值不是 IPC_PRIVATE ,并且键所对应的
12、消息队列不存在,同时标志中指定 IPC_CREAT 。参数定义key:消息队列关联的键。msgflg :消息队列的建立标志和存取权限。返回说明:成功执行时,返回消息队列标识值。失败返回-1,errno 被设为以下的某个值:EACCES:指定的消息队列已存在,但调用进程没有权限访问它,而且不拥有CAP_IPC_OWNER权限EEXIST : key 指定的消息队列已存在, 而 msgflg 中同时指定 IPC_CREAT 和 IPC_EXCL标志ENOENT:key 指定的消息队列不存在同时msgflg 中不指定 IPC_CREAT 标志ENOMEM:需要建立消息队列,但内存不足ENOSPC:需
13、要建立消息队列,但已达到系统的限制该函数使用头文件如下:#include #include #include 2、msgsnd( ) 和 msgrcv( )系统调用格式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); 功能:在消息队列上进行收发消息。为了发送消息,调用进程对消息队列必须有写权限。接收消息时必须有读权限。参数定义msqid:消息队列的识别码。m
14、sgp :指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下struct msgbuf long mtype; /* 消息类型,必须 0 */ char mtext100; /* 消息文本 */ ; msgsz :消息的大小。msgtyp:从消息队列内读取的消息形态。如果值为零,则表示消息队列中的所有消息都会被读取。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - 操作系统实验6 ms
15、gflg :用来指明核心程序在队列没有数据的情况下所应采取的行动。如果 msgflg和常数 IPC_NOWAIT 合用,则在 msgsnd()执行时若是消息队列已满,则msgsnd()将不会阻塞,而会立即返回 -1,如果执行的是 msgrcv() ,则在消息队列呈空时,不做等待马上返回-1,并设定错误码为 ENOMSG。当 msgflg 为 0 时,msgsnd()及 msgrcv() 在队列呈满或呈空的情形时,采取阻塞等待的处理模式。该函数使用头文件如下:#include #include #include 返回说明:成功执行时, msgsnd()返回 0,msgrcv() 返回拷贝到 mt
16、ext 数组的实际字节数。失败两者都返回 -1,errno 被设为以下的某个值: 对于 msgsnd EACCES:调用进程在消息队列上没有写权限,同时没有CAP_IPC_OWNER权限EAGAIN :由于消息队列的msg_qbytes 的限制和 msgflg 中指定 IPC_NOWAIT 标志,消息不能被发送EFAULT :msgp指针指向的内存空间不可访问EIDRM :消息队列已被删除EINTR :等待消息队列空间可用时被信号中断EINVAL :参数无效ENOMEM:系统内存不足,无法将msgp指向的消息拷贝进来 对于 msgrcv E2BIG :消息文本长度大于msgsz ,并且 msg
17、flg 中没有指定 MSG_NOERROR EACCES:调用进程没有读权限,同时没具有CAP_IPC_OWNER权限EAGAIN :消息队列为空,并且msgflg 中没有指定 IPC_NOWAIT EFAULT :msgp指向的空间不可访问EIDRM :当进程睡眠等待接收消息时,消息已被删除EINTR :当进程睡眠等待接收消息时,被信号中断EINVAL :参数无效ENOMSG:msgflg 中指定了 IPC_NOWAIT,同时所请求类型的消息不存在3、msgctl( )系统调用格式int msgctl(int msqid, int cmd, struct msqid_ds *buf); 功能
18、:在指定的消息队列上执行某种控制操作。参数定义msqid:消息队列识别码。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - 操作系统实验7 cmd :操作命令,可能值在下面给出:IPC_STAT :将 msqid 所指定的消息队列的信息拷贝一份到buf 指针所指向的地址。调用者必须对消息队列有读权限。IPC_SET :将由 buf 所指向的 msqid_ds 结构的一些成员写入到与这个消息队列关联的内核结构。 同时更新的字段有m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年操作系统实验 2022 操作系统 实验
限制150内