没有合适的资源?快使用搜索试试~ 我知道了~
操作系统课程实践之Linux进程通信.doc
需积分: 12 0 下载量 110 浏览量
2019-07-10
08:16:54
上传
评论
收藏 187KB DOC 举报
温馨提示
试读
18页
如果你是在做操作系统的实验,请选择我,因为我值得你拥有哦,相信我,不会错过!
资源推荐
资源详情
资源评论
苏 州 大 学 实 验 报 告
院、
系
年级专业 姓名 学号
课程名称 操作系统课程设计 成绩
指导教师 同组实验者 无 实验日期
教务处制
第 1 页,共 18 页
实 验 名 称 实验五 进程通信
一.实验目的
初步了解Linux环境下进程创建和进程间通信的机制,掌握如何利用消息和共享内
存进行通信的原理,并利用POSIX API函数编写实例程序。
二.实验内容
编制两个程序P1、P2。当这程序P1运行后,它创建一个子进程P2(也就是在P1中调
用P2),其中P1是父进程,P2由P1创建,是P1的子进程。
P1和P2利用两种机制进行通信:消息和共享内存。P1输入4个数字并指定通讯模式
通过消息或共享内存方式传送给P2;P2接收到后计算这四个数字和加减乘除四个运算符
结合后是否可以算出24;把结果通过消息机制返回P1并显示。
三.实验步骤和结果(要求给出每个步骤的结果)
1、 编译完p1.c和p2.c文件后运行p1的可执行文件,这时会提示用户选择通信
方式:
int ag;
printf("请选择进程间通讯的机制(0:共享内存,1:消息队列):");
scanf("%d",&ag);
2、 用户输入0表示选择共享内存,输入1表示选择消息队列;然后根据用户的
选择,会调用不同的通信函数:
if(ag == 0)
{
share_memory();
}
else if(ag == 1)
{
message();
}
share_memory()函数:
void share_memory()//共享内存实现进程间通信函数
{
// 生成一个key
key_t key = ftok("./", 77);
// 创建共享内存,返回一个id
int shmid = shmget(key, 8, IPC_CREAT|0666|IPC_EXCL);
if(-1 == shmid)
{
perror("shmget failed");
exit(1);
教务处制
第 2 页,共 18 页
}
// 映射共享内存,得到虚拟地址
void *p = shmat(shmid, 0, 0);
if((void*)-1 == p)
{
perror("shmat failed");
exit(2);
}
// 写共享内存
double *pp = p;
printf("请输入四个数字:\n");
for(int i=0;i<4;i++)
{
double num;
scanf("%lf",&num);
*(pp + i)=num;
}
}
message()函数:
void message()//消息队列实现进程间通信函数
{
int ret = 0;
int msgid = 0;
struct msg_st msgtxt;
msgid = msgget((key_t)KEY, IPC_CREAT);
if(msgid == -1)
{
perror("msgget");
exit(-1);
}
printf("请输入四个数字:\n");
for (int i = 0; i < 4; i++)
{
double num;
scanf("%lf", &num);
msgtxt.mtext[i] = num;
}
r e t = m s g s n d ( m s g i d , ( v o i d * ) & m s g t x t , s i z e o f ( m s g t x t . m t e x t ) ,
0);//向消息队列中发送消息
if(ret == -1)
{
perror("msgsnd");
exit(-1);
教务处制
第 3 页,共 18 页
}
}
3、 p1 通 过选 择 的 方 式 传 递 相 应 的 消 息 , 然 后 创 建 子 程 序 , 然 后 通 过
char*execv_str[]向p2传递参数(s为共享内存,m为消息队列),然后p2
通过传过来的参数采用对应的接收数据和传回数据的方式:
if (childpid == 0){ //创建子进程
//child process
char Dle[] = "/home/xsc/桌面/p2";//如果用户选择的是共享内存,标志
为"s",若为消息队列,则为"m"
if(ag == 0)
{
char * execv_str[] = {"s",NULL};
if (execv(Dle, execv_str) < 0 )
{
perror("error on exec");
exit(0);
}
}
else if(ag == 1)
{
char * execv_str[] = {"m",NULL};
if (execv(Dle,execv_str) <0 )
{
perror("error on exec");
exit(0);
}
}
}
4、 p2进程通过tfp()函数判断接受到的四个数字是否可以算出二十四点,然后
根据相应的通信机制把消息结果传回给p1,最后p1输出结果:
tfp()函数:
double option(char c, double a, double b) {
if (c == '+')
return a + b;
else if (c == '-')
return a - b;
else if (c == '*')
return a * b;
else
return a / b;
}
void yunsuan(char *opt, int *temp, char *optr, double result, int count,
int *ag) {
教务处制
第 4 页,共 18 页
剩余17页未读,继续阅读
资源评论
Holic_Xiong
- 粉丝: 57
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 机器学习和数据挖掘课程设计-米其林餐厅数据挖掘管理系统源码+使用文档说明.zip
- html html html展示我与ai的对化
- 数据结构课程设计-全国交通出行咨询模拟系统C语言实现源码.zip
- cef-binary-109.0.1+gcd5e37a+chromium-109.0.5414.8-windows32
- 基于C语言的全国交通咨询系统模拟源码.zip
- 正点原子HAL库 STM32F4 DMA(学习自用附源码)
- 炫酷代码雨,超级炫酷哦!!!
- 基于物联网MQTT协议的智能停车场管理系统
- POETIZE个人博客系统源码 - 最美博客
- 基于深度学习的行人检测系统源码+项目说明(YoloV3+Tensorflow).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功