- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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#defineTEXT_SZ 2048 structshared_use_st{ int written;//作为一个标志,非0:表示可读,0表示可写 char text[TEXT_SZ];//记录写入和读取的文本 }; #endifP1.c:#includeunistd.h#includestdlib.h#includestdio.h#includestring.h#includesys/shm.h#includeshmdata.hint main() {int child;if((child=fork())==0){execlp(./P2,(char*) 0);}int running = 1; void *shm = NULL; structshared_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(Father\n); //设置共享内存 shared = (structshared_use_st*)shm; while(running)//向共享内存中写数据 { //数据还没有被读取,则等待数据被读取,不能向共享内存中写入文本 while(shared-written
文档评论(0)