文章目录

  • 操作系统实验三、进程通信
    • 一、实验目的
    • 二、实验内容
    • 三、设计原理(或方案)及相关算法
    • 四、结果分析
    • 五、源代码

操作系统实验三、进程通信

一、实验目的

​ 1、了解和熟悉Linux支持的消息通信机制、管道道通信、共享存储区机制及信息量机制。

2、掌握利用Linux系统的进程通信机制(IPC)实现进程间交换数据的方法。

二、实验内容

​ 1、进程通信

​ 使用系统调用pipe()建立一条管道线:两个子进程P1和P2分别向管道各写一句话:

​ Child 1 is sending a message!

​ Child 2 is sending a message!

​ 父进程则从管道中读出来自两个了进程的信息,显示在屏幕上。

要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。(可以通过sleep()将自身进入睡眠)

2、 消息的创建,发送和接收.

​ (1) 使用系统调用msgget(), msgsnd(), msgsrv()及msgctl()编制一长度为1K的消息(如个人通信录信息)的发送和接收程序.

   (2) 使用共享存储区相关的系统调用 shmget(),shmat(),sgmdt(),shmctl(),编制一个与上述功能相同的程序.

​ (3) 比较上述两种消息通信机制中数据传输的时间。

三、设计原理(或方案)及相关算法

  1. 管道通信 创建一条管道,子进程写入数据,父进程写出数据。在父进程中使用 wait() 函数,这样在子进程执行 完毕之前,父进程一直要等待。

    调用pipe()建立一条管道,两个子进程分别向管道写入一句话,在父进程中使用wait()函数,使父进程等待子进程执行结束,依次输出P1、P2发来的消息。

  2. 消息的创建,接受和发送

    (1)消息队列通信 设计一个结构体来充当缓冲区,存储消息。之后使用msgget(), msgsnd(), msgsrv()及msgctl() 等函数来 实现消息的发送和接受。

    (2)使用shmget(),shmat(),sgmdt(),shmctl()等函数实现存储区的共享,轮流使用存储区来接收、发送消息

四、结果分析

2.1

2.2

五、源代码

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>void main()
{pid_t pid_1, pid_2, fd[2];char buf[50], s[50];pipe(fd);while ((pid_1 = fork()) == -1);if (pid_1 == 0){lockf(fd[1], 1, 0);sprintf(buf, "Child 1 is sending message");write(fd[1], buf, 50);lockf(fd[1], 0, 0);exit(0);}else{while ((pid_2 = fork()) == -1);if (pid_2 == 0){lockf(fd[1], 1, 0);sprintf(buf, "Child 2 is sending message");write(fd[1], buf, 50);lockf(fd[1], 0, 0);exit(0);}else{wait(0);read(fd[0], s, 50);printf("%s \n", s);wait(0);read(fd[0], s, 50);printf("%s \n", s);exit(0);}}
}

2.1

#include<stdio.h>
#include<sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#define MSGKEY 75struct msgform{long mtype;char mtext[1024];
}msg;
int msgqid,i;
void CLIENT(){int i;msgqid = msgget(MSGKEY,0777|IPC_CREAT);for(i=10;i>=1;i--){msg.mtype=i;printf("(client)send\n");msgsnd(msgqid,&msg,1024,0);}exit(0);
}
void SERVER(){msgqid = msgget(MSGKEY,0777|IPC_CREAT);do{msgrcv(msgqid,&msg,1024,0,0);printf("(server)receive\n");}while(msg.mtype!= 1);msgctl(msgqid,IPC_RMID,0);
}int main(){if(fork()){SERVER();wait(0);} else {CLIENT();}return 0;
}

2.2

#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#define SHMKEY 75int shmid ,i;
int *addr;void CLIENT(){int i;shmid = shmget(SHMKEY,1024,0777|IPC_CREAT);addr = shmat(shmid,0,0);for(i=9;i>=0;i--){while (*addr != -1);printf("(client)send\n");*addr = i;}exit(0);
}void SERVER(){do{while ( *addr == -1);printf("(server)receive\n");if(*addr != 0)*addr = -1;}while(*addr);wait(0);shmctl(shmid,IPC_RMID,0);
}int main(){shmid = shmget(SHMKEY,1024,0777|IPC_CREAT);addr = shmat(shmid,0,0);*addr = -1;if(fork()){SERVER();wait(0);} else {CLIENT();}return 0;
}

操作系统实验三、进程通信相关推荐

  1. 2020 操作系统 实验二 进程通信

    实验二.进程通信 一.实验名称 进程通信 二.实验目的 掌握用邮箱方式进行进程通信的方法,并通过设计实现简单邮箱理解进程通信中的同步问题以及解决该问题的方法. 三.实验原理 邮箱机制类似于日常使用的信 ...

  2. 操作系统——实验贰——进程通信(一)管道及共享内存

    一. 实验目的 熟悉并掌握管道机制,并实现进程间通信 熟悉并掌握共享内存机制,并实现进程间通信 二. 实验内容 任务一: (1)阅读以上父子进程利用管道进行通信的例子(例1),写出程序的运行结果并分析 ...

  3. 操作系统实验·Linux进程通信与内存管理

    预备知识 Linux进程的数据结构 在Linux中,进程用task_struct表示,所有进程被组织到以init_task为表头的双向链表中(见[include/linux/sched.h]SET_L ...

  4. ZUCC_操作系统实验_Lab7进程通信---共享内存

    lab7进程通信-共享内存 一.利用共享内存实现生产者/消费者问题的解决方案 1.代码 #include<stdio.h> #include<stdlib.h> #includ ...

  5. 操作系统实验三:进程管理

    实验三 进程管理 一.实验要求 (1)掌握操作系统中进程的基本概念: (2)掌握 Linux操作系统进程管理基本方法: (3)了解进程并发运行的过程. 二.实验内容 (1)验证实验: ① 启动vi编辑 ...

  6. linux软中断通信的基本原理,实验三 软中断通信

    实验三 软中断通信 实验目的 1.了解什么是信号 2.熟悉LINUX系统中进程之间软中断通信的基本原理 实验内容 1.编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕 ...

  7. 计算机操作系统感悟随笔--进程通信

    一.进程通信是指进程之间的信息交换 1.低级通信--进程之间的互斥和同步 信号量机制是有效的同步工具,但作为通信工具缺点如下: (1)效率低(通信量少) (2)通信对用户不透明(程序员实现,操作系统只 ...

  8. Linux实验三父子进程每隔3秒,实验三进程的创建和简单控制(学生分析.doc

    实验三进程的创建和简单控制(学生分析 实验 进程的创建和简单控制 实验目的: 掌握进程的概念和进程的状态,对进程有感性的认识: 掌握进程创建方法: 认识进程的并发执行,了解进程族之间各种标识及其存在的 ...

  9. linux中关于ssh实验,操作系统实验三linux的telnetftpssh的相关配置及验证

    操作系统实验三linux的telnetftpssh的相关配置及验证 -1-昆明理工大学信息工程与自动化学院学生实验报告( 2010 -2011 学年第 二 学期 )课程名称:操作系统 开课实验室:信自 ...

最新文章

  1. arduino点阵声音频谱_基于Arduino和频谱分析的LED音乐课节拍器
  2. VBA 中判断汉字的方法
  3. Linux下gcc编译中关于头文件与库文件搜索路径相关问题
  4. mybatis传入list、array等数据集合的处理
  5. Eclipse和MyEclipse使用技巧--解决MyEclipse中的js报错的小方法
  6. python数据分析方向_python数据分析方向,面试题解答
  7. GDCM:gdcm::SwapperDoOp的测试程序
  8. 如何科学地浪费朋友手中的啤酒
  9. android 管理fragment,在 Fragment 之间传递数据
  10. 快速实现win11恢复win10系统 分享无损恢复win10系统
  11. ioi 赛制_如何评价 IOI 2017(国际信息学奥林匹克竞赛)?
  12. 联发科处理器真有那么不堪吗?
  13. win10 卸载软件 清除注册表 Revo Uninstaller Pro
  14. 大数据应用“情感趋同现象”伦理风险问题刍议
  15. 用HTML做窗体程序界面
  16. 如何用看板工具做轻量级项目管理
  17. 干货 | 相机标定:机器人手眼标定
  18. HBBuilderProjest逆向分析与安全性扯淡
  19. 搭建Ethereum以太坊测试网络Rinkeby节点
  20. 易佰关键词查询工具 2013 V2.0

热门文章

  1. python线程中join和和setDaemon
  2. java过滤器和拦截器的使用及其区别
  3. 高并发编程-Thread#join方法的使用及使用场景分析
  4. Redis进阶学习08--多级缓存
  5. 竞争之王CE0商战课“打赢商战的第一课”
  6. react之withRouter的作用
  7. windows上cmd简单上传文件到linux
  8. 决策树之构造决策树(一)
  9. 漫画:面试官考我图形推理题,我该怎么办?
  10. 【处世】守住一颗宁静的心