操作系统实验5进程间基于共享存储区的通信

合集下载

操作系统进程通信(信号,共享存储区,消息队列)

操作系统进程通信(信号,共享存储区,消息队列)
7/7
letter.txt 内容为:operatingsystemlixin numbet.txt 内容为:12342007202314 ·结果分析及解释
1.首先输出提示信息 Enter some text: ,提示输入文本。 2.首先输入 operating system 1234 [][]\] ,包括字母数字和无效字符。 3.再次输出提示信息 Enter some text: 。 4.输入 lixin2007202314 5.再次输出提示信息 Enter some text: 后输入 quit 退出。 6.输出提示信息 Distributed over! (7)问题分析
strcpy(msg.text,"Enter some text:\n"); msgsnd(msgid,&msg,MAXSIZE,IPC_NOWAIT);//发送提示信息 kill(pid1,SIGUSR1);//向子进程 1 发送信号,以显示提示信息 sleep(1); 6.父进程使用 fgets()函数读入一行输入,fgets()函数读入结束时的回车符 并自动添加字符串结束符。 7.对于输入 “quit” 退出的解决,一开始使用函数 strncmp(buf,”quit”,4);但后 来考虑到输入诸如”quitxy”等字符床也会退出,因此将 strncmp 改为 strcmp 函数,具 体代码为: if(strcmp(buf,"quit\n&#. 共享存储区: 主要实现语句: shmid=shmget(key,size,flag); shmat(shmid,addr,flag); shmdt(addr); shmctl(shmid,cmd,buf)。 2. 消息队列: 主要实现语句: struct my_msg { long int my_msg_type;

实验五:进程间通信

实验五:进程间通信

实验五:进程间通信实验五:进程间通信●实验目的:学会进程间通信方式:无名管道,有名管道,信号,共享内存●实验要求:(一)在父进程中创建一无名管道,并创建子进程来读该管道,父进程来写该管道(二)在进程中为SIGBUS注册处理函数,并向该进程发送SIGBUS信号(三)创建一共享内存,实现放进程间通信●实验器材:软件:安装了Linux的vmware虚拟机硬件:PC机一台●实验步骤:(一)无名管道的使用1、编写实验代码pipe_rw.c#include#include#include#include#include#includeint main(){int pipe_fd[2];pid_t pid;char buf_r[100];char* p_wbuf;int r_num;memset(buf_r,0,sizeof(buf_r));/*创建管道*/if(pipe(pipe_fd)<0){printf("pipe create error\n");return -1;}/*创建子进程*/if((pid=fork())==0) //子进程执行代码{//1、子进程先关闭了管道的写端//2、让父进程先运行,这样父进程先写子进程才有内容读//3、读取管道的读端,并输出数据//4、关闭管道的读端,并退出}else if(pid>0) //父进程执行代码{//1、父进程先关闭了管道的读端//2、向管道写入字符串数据//3、关闭写端,并等待子进程结束后退出}return 0;}2、编译应用程序pipe_rw.c3、运行应用程序子进程先睡两秒让父进程先运行,父进程分两次写入“hello”和“pipe”,然后阻塞等待子进程退出,子进程醒来后读出管道里的内容并打印到屏幕上再退出,父进程捕获到子进程退出后也退出4、由于fork函数让子进程完整地拷贝了父进程的整个地址空间,所以父子进程都有管道的读端和写端。

进程实验-进程间通信(管道、消息、共享内存、软中断)

进程实验-进程间通信(管道、消息、共享内存、软中断)

进程实验3 Linux 进程间通信一、软中断信号的处理,实现同一用户的各进程之间的通信。

●相关的系统调用⏹kill(pid ,sig):发送信号⏹signal(sig, func):指定进程对信号sig的处理行为是调用函数func。

●程序清单#include <unistd.h>#include <stdio.h>#include <signal.h>void waiting();void stop();int wait_mark;main(){int p1,p2;while((p1=fork())==-1);if(p1>0){while((p2=fork())==-1);if(p2>0){ printf("parent\n");/*父进程在此完成某个操作、或接收到用户从键盘输入的特殊按键命令后发出下面的信号。

这里省略。

*/kill(p1,16);kill(p2,17);wait(0);wait(0);printf("parent process id killed! \n");exit(0);}else/* p2==0*/{printf("p2\n");wait_mark=1;signal(17,stop);waiting();printf("child process 2 is killed by parent! \n");exit(0);}}else/*p1==0*/{printf("p1\n");wait_mark=1;signal(16,stop);waiting();printf("child process 1 is kelled by parent! \n");exit(0);}}void waiting(){while(wait_mark!=0);}void stop(){wait_mark=0;}●输入并运行此程序,分析程序的运行结果。

操作系统进程通信报告

操作系统进程通信报告

实验四:进程同步实验一、实验任务:1、熟悉操作系统进程通信原理2、设计程序,实现共享内存、管道通信、消息通信二、实验原理:1、进程间通信的几种方法简介(1)消息队列:消息队列是消息的链接表,包括Posix消息队列systemV消息队列。

有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。

(2)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。

是针对其他通信机制运行效率较低而设计的。

往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

(3)无名管道(Pipe)及有名管道(named pipe):有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;无名管道可用于有亲缘关系的进程之间彼此的通信,进行通信时候必须有一定的机制保证对管道写和读的互斥:即在读是要关闭写的端口,而在写的时候也要保证读的一端是关闭的。

2、进程通信函数(1)消息队列有关系统调用函数a.创建消息队列使用msgget()函数:#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>int msgget(key_t key, int flag) ;该函数成功调用返回消息队列标识符。

其中的key是关键字,可以由ftok()函数得到:key=ftok(“.”,’a’);其中”.”可以是任何目录,’a’是任意字符,即所有群组标识。

flag是标识,IPC_CREAT位表示创建,一般由服务器程序创建消息队列时使用。

如果是客户程序,必须打开现存的消息队列,必须不使用IPC_CREAT。

发送和接收的消息都必须使用一个类似msgbuf的结构表示,msgbuf结构定义如下:struct msgbuf{long mtype;char mtext[1];}上面的定义,消息内容只有一个字节,是不实用的,一般我们需要重新定义一个结构:struct amsgbuf{long mtype;char mtext[200];}其中的mtype都是消息类型。

操作系统原理进程通信共享内存

操作系统原理进程通信共享内存

操作系统原理进程通信共享内存操作系统中的进程通信和共享内存是两个相互关联的概念。

进程通信是指不同进程之间进行信息交换的机制,而共享内存则是实现进程通信的一种方法。

在本文中,我们将详细介绍进程通信和共享内存的原理和一些常用的实现方式。

一、进程通信的原理进程通信是操作系统中实现不同进程之间信息传递和协同工作的关键机制。

它可以分为两种基本形式:同步和异步。

1.同步通信:同步通信是指发送进程和接收进程在通信操作期间需要进行协调和同步。

在同步通信中,发送进程必须等待接收进程完成后才能继续执行。

2.异步通信:异步通信是指发送进程和接收进程在通信操作期间相互独立,不需要进行明确的协调和同步。

在异步通信中,发送进程可以在发送消息后立即继续执行其他任务,而不需要等待接收进程。

常见的进程通信机制包括管道、消息队列、信号量和套接字等。

下面将对其中的一种机制进行详细介绍。

1. 管道(Pipe):管道是一种特殊的文件,用于将一个进程的输出连接到另一个进程的输入。

管道提供了一种单向的、先进先出的数据传输方式。

在管道中,写操作和读操作是同步的,即写操作会一直阻塞直到有进程来读取数据。

很多操作系统提供了管道的实现方式,如在Unix/Linux中可以使用pipe(系统调用创建一个管道。

在创建管道后,相关进程可以通过文件描述符进行读写操作。

二、共享内存的原理共享内存是一种允许两个或多个进程之间共享地址空间的机制。

通过共享内存,进程可以直接读取和修改彼此的数据,从而实现高效的数据共享。

共享内存的实现包括以下步骤:1. 创建共享内存区域:操作系统提供了一些系统调用,如shmget(,用于创建共享内存区域。

创建共享内存区域时需要指定大小和一些其他的控制参数。

2. 连接到共享内存:创建共享内存区域后,进程可以使用shmat(系统调用将共享内存区域连接到自己的地址空间,从而可以直接读取和修改共享内存中的数据。

3.操作共享内存:连接到共享内存后,进程可以像操作普通内存一样对共享内存进行读写操作。

进程的共享存储区通信--带答案版

进程的共享存储区通信--带答案版

实验二进程管理2.4 进程的共享存储区通信1.实验目的(1) 通过编写共享存储区的通信程序,理解Linux共享存储区机制。

(2) 掌握进程共享存储区通信相关系统调用。

(3) 理解系统调用和用户命令的区别。

2.实验类型:验证型3.实验学时:24.实验原理和知识点(1) 实验原理:并发运行的进程之间,可以通过共享存储机制进行通信。

(2) 知识点:共享存储的创建、附接和断接5.实验环境(硬件环境、软件环境):(1)硬件环境:Intel Pentium III 以上CPU,128MB以上内存,2GB以上硬盘(2)软件环境:linux操作系统。

6. 预备知识(1) 共享存储区共享存储区机制直接通过共享虚拟存储空间进行通信。

通信时,进程首先提出申请,系统为之分配存储空间并返回共享区标示符。

这时,进程把它附加到自己的虚拟存储空间中。

通信的进程对共享区的访问要互斥地进行。

(2) shmget()系统调用:头文件 #include <sys/shm.h>函数原型 int shmget(key_t key, int size, int flag);功能:申请一个共享存储区。

成功返回共享内存标识符,失败则返回-1。

参数:key是共享存储区关键字。

size是存储区大小。

flag访问权限和控制标志。

(3) shmat()系统调用:头文件 #include <sys/shm.h>函数原型 int shmat(int id, char *addr, int flag);功能:将一个共享存储区附接到进程的虚地址空间。

成功返回起始地址,失败则返回-1。

数:id是共享存储区标识符。

addr是附接的虚地址。

flag访问权限和控制标志。

(4) shmdt()系统调用:头文件 #include <sys/shm.h>函数原型 int shmdt(char *addr);功能:一个共享存储区与指定进程的断开。

操作系统实验报告(进程间的共享存贮区和信号量通信)

操作系统实验报告(进程间的共享存贮区和信号量通信)

case -1:perror("fork()");exit(0);case 0:do_child_loop(sem_set_id,FILE_NAME);exit(0);default:break;}}for(i = 0;i<10;i++){int child_status;wait(&child_status);}printf("main is done");fflush(stdout);return 0;}运行结果:二、共享主存段机制共享主存段为进程提供了直接通过主存进行通信的有效手段,不像消息缓存机制那样需要系统提供缓存,也不像pipe机制那样需要事先建立一个特殊文件,而是有通信双方直接访问某些共享虚拟存储器空间。

在系统V中,系统管理一组共享主存段控制块。

通信进程在使用共享主存段以前,首先提出申请,系统为止分配存储空间并返回共享主存段标识号。

一个共享段建立后,进程把它被附加到自己的虚拟存储空间中。

一个进程可以附加多个共享主存段。

一个主存段一旦被附加到进程的虚拟机空间后,对它的访问以其他虚拟机的访问完全相同。

但为了保证共享主存段数据完整性,通信的进程之间要互斥的进行访问。

当通信进程不再需要该共享主存段时,可使用命令将其与进程分离,从而使其进程的虚空间删除。

为了理解进程通过共享主存段的通信过程,下面举例,一个是进程向共享段写信息的例子:一个是进行从共享段读信息的例子。

代码如下:四、实验过程与分析一、信号量机制在第一个例子的程序中创建了5个并发子进程,互斥地对文件进行写操作,将自己的进程号写到文件中去,信号量的初值为1,当地一个进程执行update_file函数时首先将信号量值-1,(相当于P操作)致使其它进程等待无法操作文件,直到其结束后,将其值变为1后(相当于V操作),其它进程并发竞争对文件的写操作,并将自己的pid 写入文件中。

在linux中信号量机制的执行既步骤如下所示:(1)信号量的定义:struct semaphore {spinlock_t lock;unsigned int count;struct list_head wait_list;};在linux中,信号量用上述结构体表示,我们可以通过该结构体定义一个信号量。

操作系统中的进程通信机制探究

操作系统中的进程通信机制探究

操作系统中的进程通信机制探究在操作系统中,进程之间的通信机制是实现并发执行的基础。

本文将探究进程通信机制相关的概念、技术、方法和实现。

一、概念进程是计算机中的一个基本概念,指的是正在执行中的程序。

每个进程都有自己的地址空间和资源,相互独立运行。

通信机制则是为了实现进程之间的信息交互和共享资源。

二、技术进程通信机制主要有两种技术:共享内存和消息传递。

1. 共享内存共享内存是指多个进程使用同一块物理内存,可直接访问和修改。

在实现共享内存时,需要解决以下问题:(1) 同步:多个进程同时访问共享内存时需要协调,避免数据冲突。

可以使用信号量等同步方法。

(2) 互斥:同一时刻只能有一个进程修改共享内存,以避免竞态条件。

(3) 保护:限制只有授权进程才能访问共享内存。

2. 消息传递消息传递是指进程间通过消息传递机制进行通信,每个进程都拥有自己的私有内存区域。

在实现消息传递时,需要解决以下问题:(1) 发送和接收:进程需要发送和接收消息,实现双方互相发送和接收信息。

(2) 缓存:消息缓存用于暂存无法立刻接收的消息。

(3) 通信方式:消息传递可分为同步和异步通信,分别表示发送端是否需要等待接收确认。

三、方法进程通信采用的主要方法有管道、信号、套接字、共享内存和消息队列。

1. 管道管道是一种半双工的通信方式。

管道是进程间单向通信的方法,可以通过多个管道实现双向通信。

2. 信号信号是一种异步通信方式,常用于通知接收端发生某个事件。

在Linux系统中,常用的信号有SIGUSR1、SIGUSR2、SIGKILL 等。

3. 套接字套接字是一种全双工的通信方式。

套接字可以实现不同计算机之间的通信,常用于实现网络编程。

4. 共享内存共享内存是一种高效的通信方式,能够实现非常快速的进程间通信。

但是需要注意同步和互斥问题。

5. 消息队列消息队列是一种基于消息传递的通信方式,可以保证消息有序性、持久性和多路复用等特性。

四、实现在Linux系统中,进程间通信的实现主要采用系统调用,常见的系统调用包括pipe、fork、shmget、msgget和socket等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
pint=(int *)addr;
for(i=91;i>=64;i--)
*pint++=i;
pint=(int *)addr;
*pint=0;
shmctl(ห้องสมุดไป่ตู้hmid,IPC_RMID,0);
exit(0);
}
}
}
共享存储区所用的头文件
全局变量shmid
外部函数声明
建立进程1
建立256字节共享区SHMKEY
pint=(int*)addr;
for(i=0;i<20;i++)
*pint++=i;
pint=(int*)addr;
*pint=20;
while(*pint==20);
for(i=0;i<=26;i++)
printf("%c",*pint++);
shmctl(shmid,IPC_RMID,0);
exit(0);
共享区首地址
通过循环往共享区内写入依次数字1~24
共享区第一个字中写入长度24,以便接收进程读
等待接收进程读
取共享存储区SHMKEY的id
连接共享区
共享区的第一个字节为零时,等待,因为还没写完
打印共享区中的内容
结果分析(含实现中出错原因分析)
指导教师评语、评分
评分:
指导教师:
年月日
主要代码
注释
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>
#include<stdlib.h>
#define SHMKEY69
#define K 50
int shmid;
main()
{
int i,*pint,p1,p2;
[实验内容]
编写一段程序,同时父进程创建两个子进程p1和p2;并使子进程p1与子进程p2通过共享存储区相互发送数据(512字节)。
实现的思想、方法和技术(含数据结构、算法)
编写一段程序,同时父进程创建两个子进程p1和p2;并使子进程p1与子进程p2通过通过共享存储区相互发送数据(512)。linux系统的通信机构IPC中消息通信机制提供四个操纵共享存储区的系统调用。shmget()的主要功能是建立新的共享存储区或返回一个已存在的共享存储区描述字,shmat(shmid,addr,flag)的主要功能是将物理共享区附接到进程虚拟地址空间,其中shmid是shmget()共享存储区描述字,addr等于0有系统自动选址进行附接,flag置0既能读又能写。shmdt()的功能是断接一个共享存储区,shmctl()的主要功能是查询及设置一个共享存储区状态和有关参数。使用以上的系统调用不仅减少了数据流动带来的硬件开销,还是批次的通信不仅仅局限于接受和发送数据,还可以操作彼此的某些虚拟存储区。
char *addr;
while((p1=fork())==-1);
if(p1==0)
{
for(i=0;i<20;i++)
shmid=shmget(SHMKEY,K,0777|IPC_CREAT);
addr=shmat(shmid,0,0);
printf("\naddr 0x%x\n",addr);
}
else
{
while((p2=fork())==-1);
if(p2==0)
{
shmid=shmget(SHMKEY,K,0777);
addr=shmat(shmid,0,0);
pint=(int*)addr;
while(*pint==0);
for(i=0;i<20;i++)
printf("%d",*pint++);
内蒙古师大计算机与信息工程学院
《操作系统》课程实验报告
实习题目
计算机操作系统实验
进程间基于共享存储区的通信
指导教师
玉柱
职称
副教授
学生姓名
学号
日期
2016/12/21
实现工具
PC机
实现环境
Linux系统
实习内容(功能、目标)
[实验目的]
系统了解linux系统的通信机构IPC,掌握IPC中共享存储区通信机制,理解共享存储区通信的方法及特征。
相关文档
最新文档