计算机操作系统 实验四:进程通信(二)

计算机操作系统 实验四:进程通信(二)1.实验目的学习如何利用消息缓冲队列进行进程间的通信,并加深对消息缓冲队列通信机制的理解。2.实验内容(1)了解系统调用msgget()、msgsnd()、msgrcv()、msgctl()的功能和实现过程。(2)编写一段程序,使其用消息缓冲队列来实现父进程和子进程之间的通信。父进程先建立一个关键字为MSGKEY(如75)(即#defineMSGKEY75)的消息队列,…

1 .实验目的

学习如何利用消息缓冲队列进行进程间的通信,并加深对消息缓冲队列通信机制的理解。

2 .实验内容

(1) 了解系统调用msgget()、msgsnd()、msgrcv()、msgctl()的功能和实现过程。

(2) 编写一段程序,使其用消息缓冲队列来实现父进程和子进程之间的通信。父进程先建立一个关键字为MSGKEY(如75)(即#define MSGKEY 75)的消息队列,然后等待接收类型为1的消息;在收到请求消息后,它便显示字符串“serving for client ”和接收到的子进程的进程标识数,表示正在为子进程服务;然后再向子进程发送一应答消息,该消息的类型是该子进程的进程标识数,而正文则是父进程自己的标识数。子进程则向消息队列发送类型为1的消息(消息的正文为自己的进程标识数),以取得父进程的服务,并等待父进程发来的应答;然后显示字符串“receive reply from ”和接收到的父进程的标识数。

3 .实验步骤

(1) 了解系统调用msgget()、msgsnd()、msgrcv()、msgctl()的功能和实现过程。

msgget()

功能:得到消息队列标识符或创建一个消息队列对象

msgctl()

功能:获取和设置消息队列的属性

msgsnd ()

功能:将消息写入到消息队列

msgrcv()

功能:从消息队列读取消息

 

(2) 编写一段程序,使其用消息缓冲队列来实现父进程和子进程之间的通信。父进程先建立一个关键字为MSGKEY(如75)(即#define MSGKEY 75)的消息队列,然后等待接收类型为1的消息;在收到请求消息后,它便显示字符串“serving for client ”和接收到的子进程的进程标识数,表示正在为子进程服务;然后再向子进程发送一应答消息,该消息的类型是该子进程的进程标识数,而正文则是父进程自己的标识数。子进程则向消息队列发送类型为1的消息(消息的正文为自己的进程标识数),以取得父进程的服务,并等待父进程发来的应答;然后显示字符串“receive reply from ”和接收到的父进程的标识数。

程序代码:

#include<stdio.h>

#include<sys/msg.h>

#define MSGKEY 75

struct msgform{

    long mtype;

    char mtext[1024];

};

int main(){

    int id;

    struct msgform msg;

    id=msgget(MSGKEY,0777|IPC_CREAT);

    if(fork()==0){

        msg.mtype=1;

        sprintf(msg.mtext,"%d",getpid());

        msgsnd(id,&msg,sizeof(msg),0);

        sleep(1);

        msgrcv(id,&msg,sizeof(msg),0,0);

        printf("receive reply form %s\n",msg.mtext);

    }else{

       msgrcv(id,&msg,sizeof(msg),0,0);

       if(msg.mtype==1){

        printf("%d\n",getpid());

        printf("serving for client,%s\n",msg.mtext);

        sprintf(msg.mtext,"%d",getpid());

        msgsnd(id,&msg,sizeof(msg),0);

        sleep(2);

        msgctl(id,IPC_RMID,0);

          }

    }

   return 0;

}

程序截图:

计算机操作系统 实验四:进程通信(二)

运行结果:

计算机操作系统 实验四:进程通信(二)

 

3 .思考

自己写的,有些地方不准确,如果错误还请指正

(1) 消息缓冲机制是否提供了发送进程和接收进程之间的同步功能?同步是如何进行的?

是。当写进程把一定数量的数据写入pipe,便去睡眠等待,直到读进程取走数据后,再把它唤醒。当读进程读一空的pipe时,也应睡眠等待,直到写进程将数据写入管道后,才将之唤醒,从而实现进程的同步。

 

(2) 消息缓冲机制有什么特点,它适合于何种场合?

消息缓冲可以不再局限于父子进程.而允许任意进程通过共享消息队列来实现进程间通信.并由系统调用函数来实现消息发送和接收之间的同步.从而使得用户在使用消息缓冲进行通信时不再需要考虑同步问题。使用方便,但是信息的复制需要额外消耗CPU的时间,不适宜于信息量大或者操作频繁的场合。

 

如果文章对你有用的话点个赞鼓励一下吧!

今天的文章计算机操作系统 实验四:进程通信(二)分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/32076.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注