linux中的c语言编程-进程间通信
操作系统第三次实验
张焓
实验名称:
进程间的信息通信
实验目的:
了解和熟悉Linux支持的通信机制、共享存储区机制及信号量机制。
实验方法
在shmdata.h中编写共享的内存区域存放的数据的结构;
编写P2.c,首先声明一些标识符与将会用到的地址:
继续编写P2.c,我们开始在P2.c中创建共享内存,注意这里创建的贡献内存key_t为1234,在P1.c中我们需要用到这一个key,以使得两程序可以通过共享内存进行通信:
继续编写P2.c,将共享内存连接到当前进程的地址空间中:
继续编写P2.c,读取共享内存中缓存的数据,并将该数据输出显示于屏幕;并且在检测到输入”end”前重复输出在P1.c中输入的存入共享的内存缓冲区中的数据:
继续编写P2.c,在所有执行操作已经结束(即输入了”end”后)对共享的内存缓冲区进行清理:
编写完成后编译P2.c生成可执行文件P2
在P1.c中首先利用fork()函数创建一个子进程,在子进程中使用execlp()调用可执行文件P2:
在子程序创建成功、并已对必要参数进行预处理后,我们创建一个共享内存,用到了第(3)步中的key_t:1234:
将共享内存地址连接到当前进程的地址空间:
设置共享内存,在这里P1.c不停的在屏幕中提示用户输入字符,在用户输入过后P1将输入的内容放进共享的内存缓冲区,P1进入等待状态,当子程序P2就绪后由P2提取共享的内存缓冲区中的数据并显示在屏幕上,在P2成功输出后将共享内存中的数据中的written项修改,以此告诉P1已经处理完毕:
直到用户输入了”end”后,P1才停止继续调用P2程序:
在整个程序结束前,我们切断P1与共享的内存缓冲区的连接:
最后将P1.c编译后运行:
实验步骤
启动计算机并运行linux系统;
打开终端进行程序书写P1.c,P2.c;
根据Linux系统的gcc自带编译器进行运行编译;
分析运行出现的问题;
观察运行结果,并思考;
退出终端并写出实验报告;
主要结论
通过这次实验,我对Linux支持的消息通讯机制,共享存储区信息量机制以及相应同步互斥有了更好的了解;
分析和讨论
由于保护的缘故,通常一个进程不能直接访问另一个进程的资源,也就是说,进程之间互相封闭。但在一个复杂的应用系统???,使用多个相关的进程来共同完成一项任务是时常发生的,因此进程之间通信是必须的,进程通过通信来共享资源和信息,一个操作系统内核必须提供进程间的通信机制。而在这次实验中主要就用到了C语言库sys/shm.h中的三个函数使得在主程序和子程序中创建了一个共享的内存缓冲区,并借此让两程序进行了通信。
附录:
shmdata.h:
#ifndef _SHMDATA_H_HEADER
#define _SHMDATA_H_HEADER
#define TEXT_SZ 2048
struct shared_use_st
{
int written;//作为一个标志,非0:表示可读,0表示可写
char text[TEXT_SZ];//记录写入和读取的文本
};
#endif
P1.c:
#include unistd.h
#include stdlib.h
#include stdio.h
#include string.h
#include sys/shm.h
#include shmdata.h
int main()
{
int child;
if((child=fork())==0)
{
execlp(./P2,(char*) 0);
}
int running = 1;
void *shm = NULL;
struct shared_use_st *shared = NULL;
char buffer[BUFSIZ + 1];//用于保存输入的文本
int shmid;
//创建共享内存
shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);
if(shmid == -1)
{
fprintf(stderr, shmget failed\n);
exit(EXIT_FAILURE);
}
//将共享内存连接到当前进程的地址空间
shm = shmat(shmid, (void*)0, 0);
if(shm == (void*)-1)
{
fprintf(stderr, shmat failed\n);
exit(EXIT_FAILURE);
}
printf(Fathe
您可能关注的文档
最近下载
- DB54∕T 0181-2019 高寒高海拔地区城镇给水工程设计规范(西藏自治区).pdf VIP
- 工业激光安全培训课件.ppt VIP
- Windchill模块功能白皮书.doc VIP
- 工程图学基础(第三版)刘宇红全套PPT课件.ppt
- 慢性肾脏病早期筛查、诊断及防治指南(2022年版).pptx VIP
- 2025年四川省达州市法官逐级遴选考试题及答案.docx VIP
- 一种4,6-二氨基间苯二酚二盐酸盐的生产系统.pdf VIP
- 贵州省六盘水市高二上学期1月期末英语试题(含答案).docx VIP
- 奥迪A6轿车ABS系统故障诊断与维修.doc VIP
- 备战2025广东省深圳市中考数学真题汇编《圆的计算与证明》含答案解析.pdf VIP
原创力文档

文档评论(0)