实验二进程管理
2.4 进程的共享存储区通信
1.实验目的
(1) 通过编写共享存储区的通信程序,理解Linux共享存储区机制。
(2) 掌握进程共享存储区通信相关系统调用。
(3) 理解系统调用和用户命令的区别。
2.实验类型:验证型
3.实验学时:2
4.实验原理和知识点
(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);
功能:一个共享存储区与指定进程的断开。
(5) shmctl()系统调用:
头文件#include <sys/shm.h>
函数原型int shmctl(int id, int cmd, struct_ds* buf;
功能:共享存储区的控制操作。
成功返回0,失败则返回-1。
参数:id是共享存储区标识符。
cmd为IPC_STAT共享存储的区的控制信息块读入buf。
cmd为IPC_SET则共享存储区的控制信息块读入buf。
cmd 为IPC_RMID则删除shmid 指示的共享内存。
7.实验内容及步骤:
【任务】
使用系统调用shmget()、shmat()、shmdt()、shmctl(),编写两进程通过共享存储区进行通信的程序。
(1)程序设计
约定共享区关键字75。
创建两个子进程client和server。
Client发送10条消息。
Server接收消息,完毕后删除共享区。
//share.c
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <stdio.h>
#define SHMKEY 75 /* 定义共享存储区关键词*/
int shmid,i;
int *addr;
void Client()
{ int i;
shmid=shmget(SHMKEY,1024,0777); /* 获取共享区, 长度1024,关键词为SHMKEY */ addr=(int*)shmat(shmid,0,0); /* 共享区的起始地址为addr */
for(i=9;i>=0;i--)
{ while(*addr!=-1); /* 在这里做一个标号A */
printf("(client %d)sent\n",i); /* 打印(client) sent */
*addr=i; /* 把i赋给addr所指向的区域*/
}
exit(0);
}
void Server()
{ shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /* 创建共享区*/ addr=(int*)shmat(shmid,0,0); /* 共享区的起始地址为addr */
do
{ *addr=-1;
while(*addr==-1); /* 等待发来信息, 转到上面的标号A; */
printf("(server %d)received!\n",*addr); /* 服务进程使用共享区*/ }while(*addr);
shmctl(shmid,IPC_RMID,0);
exit(0);。
}
int main()
{ int i;
while((i=fork())==-1);
if(!i) Server();
else {
while((i=fork())==-1);
if(!i) Client();
}
wait(0);
wait(0);
return 1;
}
(2)上机操作
键入vi share.c
键入i并输入源代码。
按Esc键
存盘:wq
编译gcc –o share share.c。
运行 ./share
观察屏幕,记录结果。
THANKS !!!
致力为企业和个人提供合同协议,策划案计划书,学习课件等
等
打造全网一站式需求
欢迎您的下载,资料仅供参考。