进程间通信编程 c语言,linux中的c语言编程-进程间通信.docx

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 #include #include #include #include #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);

你可能感兴趣的:(进程间通信编程,c语言)