操作系统实验(5)

上传人:壹****1 文档编号:564795714 上传时间:2023-11-14 格式:DOCX 页数:12 大小:25.98KB
返回 下载 相关 举报
操作系统实验(5)_第1页
第1页 / 共12页
操作系统实验(5)_第2页
第2页 / 共12页
操作系统实验(5)_第3页
第3页 / 共12页
操作系统实验(5)_第4页
第4页 / 共12页
操作系统实验(5)_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《操作系统实验(5)》由会员分享,可在线阅读,更多相关《操作系统实验(5)(12页珍藏版)》请在金锄头文库上搜索。

1、实验五 进程通信一目的和要求学习如何利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通信,并加 深对上述通信机制的理解。二实验内容1、了解系统调用 pipe( ),msgget( ), msgsnd( ),msgrcv( ), msgctl( ), shmget( ), shmat( ), shmdt( ), shmctl( )的功能和实现过程。2、利用 pipe( ) 等系统调用编写一段程序,并发进程间通过管道实现数据传送。3、利用 msgget( )、msgsnd( )、msgrcv( )、msgctl( )等系统调用编写一段程序,实现并发 进程间消息的发送和接收。4、利用 shmg

2、et( )、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( )系统调用格式pipe(filedes)参数定义int pipe(filedes);int filedes2;其中,filedesl是写入端,filedesO是读出端。该函数使用头文件如下:#include #inlcude #include 功能:建立一无名管道。管道建立后,写进程将数据写入文件filedes1,读进程 从文件filedes0中读数据,从而实现读/写进程的管道通信。管道是一个共享资源, 写/写进程、读/写进程应互斥使用管道。2、read( )/*Windo

5、ws 中的 C 语言也有此函数*/ 系统调用格式read(fd,buf,nbyte)功能:从 fd 所指示的文件中读出 nbyte 个字节的数据,并将它们送至由指针 buf 所指示的缓冲区中。如果该文件被加锁,则等待,直到锁打开为止。参数定义int read(fd,buf,nbyte);int fd;char *buf; unsigned nbyte;3、write( ) /*Windows 中的 C 语言也有此函数*/ 系统调用格式write(fd,buf,nbyte)功能:把nbyte个字节的数据,从buf所指向的缓冲区写到由fd所指向的文件中。 如果文件被加锁,则暂停写入,直至开锁。参数

6、定义同 read( )。编写、运行程序,观察运行结果,并分析。任务 3:利用 msgget( )、msgsnd( )、msgrcv( )、msgctl( )等系统调用编写两个程序 client.c和server.c,分别用于消息的发送和接收。server 建立一个 key 为 75 的消息队列,等待其它进程发来的消息。当遇到类型为 1的消息,则作为结束信号,取消该队列,并退出server。server每接收到一个消息后 显示一句“(server)received。client使用key为75的消息队列,先后发送类型从10到1的消息,然后退出。最 后一个消息,即是 server 端需要的结束信号

7、。 client 每发送一条消息后显示一句 “(client)sent”。server.c 参考程序如下:#include #include #include #include #include #define MSGKEY 75 struct msgformlong mtype; char mtext1000;msg;int msgqid;void server()msgqid=msgget(MSGKEY,0777|IPC_CREAT);/*创建 75#消息队列*/domsgrcv(msgqid,&msg,1030,0,0);/*接收消息*/printf(server)receivedn);

8、while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);/*删除消息队列,归还资源*/exit(0);main()server();client.c 参考程序如下:#include #include #include #include #include #define MSGKEY 75 struct msgformlong mtype;char mtext1000;msg;int msgqid;void client()int i;msgqid=msgget(MSGKEY,0777);/* 打开 75#消息队列*/for(i=10;i=1;i-) msg.

9、mtype=i; printf(client)sentn);msgsnd(msgqid,&msg,1024,0);/* 发送消息 */exit(0);main()client();将上述两个程序分别编译为server和client,并按以下方式执行: ./server & ipcs - q./clientClient 和 server 分别发送和接收了 10条消息。观察运行结果,注意发送方发送消 息和接收方接收消息的顺序。涉及到的系统调用:1、msgget( ) 系统调用格式int msgget(key_t key, int msgflg); 功能:获取与某个键关联的消息队列标识。消息队列被建

10、立的情况有两种: (1)如果键的值是 IPC_PRIVATE。(2)或者键的值不是IPC_PRIVATE,并且键所对应的消息队列不存在,同时标志中 指定 IPC_CREAT。参数定义key:消息队列关联的键。 msgflg:消息队列的建立标志和存取权限。返回说明:成功执行时,返回消息队列标识值。失败返回-1, errno 被设为以下的某个值:EACCES :指定的消息队列已存在,但调用进程没有权限访问它,而且不拥有 CAP_IPC_OWNER 权限EEXIST: key指定的消息队列已存在,而msgflg中同时指定IPC_CREAT和IPC_EXCL 标志ENOENT: key指定的消息队列不

11、存在同时msgflg中不指定IPC_CREAT标志ENOMEM :需要建立消息队列,但内存不足ENOSPC :需要建立消息队列,但已达到系统的限制 该函数使用头文件如下:#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);功能:在消息队列上进行收发消息。

12、为了发送消息,调用进程对消息队列必须有写 权限。接收消息时必须有读权限。参数定义msqid:消息队列的识别码。msgp :指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用 户可定义的通用结构,形态如下struct msgbuf long mtype; /* 消息类型,必须 0 */ char mtext100; /* 消息文本 */;msgsz:消息的大小。msg typ:从消息队列内读取的消息形态。如果值为零,则表示消息队列中的所有消 息都会被读取。msgflg:用来指明核心程序在队列没有数据的情况下所应采取的行动。如果msgflg 和常数IPC_NOWAIT合用,则在ms

13、gsnd()执行时若是消息队列已满,则msgsnd()将不会 阻塞,而会立即返回-1,如果执行的是msgrcv(),则在消息队列呈空时,不做等待马上 返回-1,并设定错误码为ENOMSG。当msgflg为0时,msgsnd ()及msgrcv ()在队列呈满 或呈空的情形时,采取阻塞等待的处理模式。该函数使用头文件如下:#include #include #include 返回说明:成功执行时,msgsnd()返回0,msgrcv()返回拷贝到mtext数组的实际字节数。失 败两者都返回-1, errno 被设为以下的某个值:对于 msgsndEACCES:调用进程在消息队列上没有写权限,同时

14、没有CAP_IPC_OWNER权限EAGAIN:由于消息队列的msg_qbytes的限制和msgflg中指定IPC_NOWAIT标志, 消息不能被发送EFAULT: msgp 指针指向的内存空间不可访问EIDRM :消息队列已被删除EINTR:等待消息队列空间可用时被信号中断EINVAL:参数无效ENOMEM:系统内存不足,无法将msgp指向的消息拷贝进来对于 msgrcvE2BIG:消息文本长度大于msgsz,并且msgflg中没有指定MSG_NOERROREACCES:调用进程没有读权限,同时没具有CAP_IPC_OWNER权限EAGAIN:消息队列为空,并且msgflg中没有指定IPC_NOWAITEFAULT: msgp指向的空间不可访问EIDRM :当进程睡眠等待接收消息时,消息已被删除EINTR:当进程睡眠等待接收消息时,被信号中断EINVAL:参数无效ENOMSG: msgflg中指定了 IPC_NOWAIT,同时所请求类型的消息不存在3、msgctl( )系统调用格式int msgctl(int msqid, int cmd, struct msqid_ds *buf);功能:在指定的消息队列上执行某种控制操作。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号