计算机操作系统第六次实验——共享主存实现进程通信

1.实验目的

    学会在Linux下创建共享主存,并解决读写者问题。

2.实验软硬件环境

  • 安装Windows7的计算机
  • VMware软件,在其上安装有Ubuntu虚拟机

3.实验内容

利用共享主存解决读写者问题。要求有写者进程创建一个共享主存,并向其中写入数据,读者进程从该共享主存中访问数据。

相关函数:

key_t ftok( const char * fname, int id )        fname就是你指定的文件名(已经存在的文件名),一般使用当前目录,如:  key_t key;key = ftok(“.”, 1); 这样就是将fname设为当前目录,id是子序号。

int shmget(key_t  key, size_t  size, int shmflg)得到一个共享内存标识符或创建一个共享内存对象并回共享内存标识符key通常要求此值来源于ftok返回的IPC键值size新建的共享内存大小,以字节为单位shmflg取共享内存标识符,若不存在则函数会报错

void *shmat(int shmid, const void *shmaddr, int shmflg)连接共享内存标识符为shmid的共享内存,连接成功后把共享内存区对象映射到调用进程的地址空间,随后可像本地空间一样访问shmid共享内存标识符shmaddr指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置Shmflg    规定主存的读写权限

int shmdt(char*addr) 把共享主存从指定进程的虚拟地址空间断开。addr是要断开连接的虚拟地址 

4.实验程序及分析

实验程序:

writer:

#include<sys/ipc.h>
#include<sys/types.h>
#include<sys/shm.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
	char name;
	int age;

}people;

int main()
{
	puts("in writer\n");
	key_t key;
	key = ftok(".",1);//id = 1
	if (key == -1)
	{
		puts("failed to create a key");
	}

	int shmid;
	shmid = shmget(key,4*1024,IPC_CREAT|0666);
	if (shmid == -1)
	{
		puts("failed to create a common memory");
	}
	people *p;

	p = (people *)shmat(shmid,NULL,0);//is not 4096
	//SHM_RDONLY is 4096
	puts("\tin common memory");
	int i = 0;
	char name = 'A';
	while(i<5)
	{	
		(*(p+i)).name=name;
		(*(p+i)).age=10+i;
		name ++;
		i ++;
	}

	int dt;
	dt = shmdt(p);
	if (dt == 0)
	{
		puts("break sucessfully!\n");
	}
	else
	{
		puts("failed to break");
	}



	return 0;
}

reader;

#include<sys/ipc.h>
#include<sys/types.h>
#include<sys/shm.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
	char name;
	int age;

}people;

int main()
{
	puts("in reader");
	key_t key;

	key = ftok(".",1);//id = 1

	if (key == -1)
	{
		puts("failed to create a key");
	}

	int shmid;

	shmid = shmget(key,4*1024,IPC_CREAT|0666);

	if (shmid == -1)
	{
		puts("failed to create a common memory");
	}



	people *p;
	p = (people *)shmat(shmid,NULL,0);//is not 4096
	//SHM_RDONLY is 4096
	puts("\tin common memory\n\tread from buff ...\n");
	int i = 0;
	while (i<5)
	{
		printf("\tthe %d one : name is %c\tage is %d\n",i+1,(*(p)).name,(*(p)).age);
		i++;
		p++;
	}

	



	return 0;
}

分析:

写者在当前目录下创建键值key,再根据key创建共享内存标识符,再由shmat函数创建一个people类型指针返回值的共享主存空间。写入五个人的名字和年龄,最后由shmdt函数把共享主存从指定进程的虚拟地址空间断开。读者同理,从共享主存中读出数据并输出到终端上。

5.实验截图

6.实验心得体会

此次实验实现了共享主存在进程间的通信,在实验过程中,经过不断的调试,对shmat函数shmdt函数等有了更深入的理解。了解了共享主存的通信机制。

发布了47 篇原创文章 · 获赞 28 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41122796/article/details/80548347
今日推荐