《Linux操作系统设计实践》实验二进程通信.doc_第1页
《Linux操作系统设计实践》实验二进程通信.doc_第2页
《Linux操作系统设计实践》实验二进程通信.doc_第3页
《Linux操作系统设计实践》实验二进程通信.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux操作系统设计实践实验二:进程通信实验目的: 进一步了解和熟悉 Linux 支持的多种 IPC 机制,包括信号,管道,消息队列,信号量,共享内存。实验环境: redhat 实验内容: (1)进程间命名管道通信机制的使用:使用命名管道机制编写程序实现两个进程间的发送接收信息。(2)进程间消息队列通信机制的使用:使用消息队列机制自行编制有一定长度的消息(1k 左右)的发送和接收程序。(3)进程间共享存储区通信机制的使用:使用共享内存机制编制一个与上述(2)功能相同的程序。并比较分析与其运行的快慢。实验代码验证:(1).使用命名管道机制编写程序实现两个进程间的发送接收信息。#include #include #define FIFO_FILE MYFIFOint main(int argc, char *argv)FILE *fp;int i;if (argc=1) printf(usage: %s n,argv0); exit(1);if (fp = fopen(FIFO_FILE, w) = NULL) printf(open fifo failed. n); exit(1);for (i = 1; i argc; i+) if (fputs(argvi,fp) = EOF) printf(write fifo error. n); exit(1); if (fputs( ,fp) = EOF) printf(write fifo error. n);exit(1); fclose(fp);return 0;#include #include #include #include #include #define FIFO_FILE MYFIFOint main()FILE *fp;char readbuf80; if (fp = fopen(FIFO_FILE, r) = NULL) umask(0); mknod(FIFO_FILE, S_IFIFO | 0666, 0);else fclose(fp); while (1) if (fp = fopen(FIFO_FILE, r) = NULL) printf(open fifo failed. n); exit(1); if (fgets(readbuf, 80, fp) != NULL) printf(Received string :%s n, readbuf); fclose(fp); else if (ferror(fp) printf(read fifo failed.n); exit(1); return 0;实验结果:Server.c将client.c写入的字符输出。分析:client.c 程序通过fopen(“MYPIO“,”w“)这个系统调用在当前目录下创建了一个名为MYPIPO的只写文件。将第一个以后的命令行参数,写进MYPIPO文件中;server.c程序首先使用fopen()系统调用试图打开MYPIPO文件,但是MYPIPO文件是只读文件,故调用失败,所以,接着调用umask(),和mknod()两个系统调用设置文件MYPIPO的属性,将文件改为有名管道类型,且是允许读写的文件(属主,属组,其他用户皆是)。最后通过fgets()这个系统调用将有名管道文件内的内容读到字符数组readbuf中,并显式。(2)使用消息队列机制自行编制有一定长度的消息(1k 左右)的发送和接收程序。#include#include #include#include#include#define key 1#define buffersize 1024int main()struct SMSGlong mtype;char mtextbuffersize;msg ;int pid;int p;while (p = fork() = -1);if(p = 0) sleep(5); pid = msgget(key, IPC_CREAT | 0600); msgrcv(pid, &msg, buffersize, 1, 0); printf(receive msg is:%sn,msg.mtext); msgctl(pid, IPC_RMID, 0); else pid = msgget(key, IPC_CREAT | 0600); msg.mtype = 1; strcpy(msg.mtext, This is the message which the parent have sent!); while (msgsnd(pid, &msg, buffersize, 0) = -1);return 0;实验结果:显示:receive msg is:This is the message which the parent have sent!分析:msg.c程序用fork()系统调用创建一个子进程。其中父进程通过msgget()系统调用创建一个消息对列,并定义所要发送的消息的类型号,最后通过msgsnd()系统调用将消息传递给消息队列;子进程先sleep()系统调用暂停一会儿,保证父子进程并发执行时,父进程能够尽量早的多执行,接着当调用msgget()系统调用,得到和父进程所创建的那个消息队列的id号,是他们两关联的是同一个消息队列,然后用msgrcv()系统调用将类型号为1的消息队列中的第一个消息拷贝到消息msg中。并输出。(3)使用共享内存机制编制一个与上述(2)功能相同的程序。并比较分析与其运行的快慢。#include#include #include#include#include#define buffersize 1024#define Key 1int main() int p; while (p = fork() = -1); if (p = 0) int pid; sleep(5); pid = shmget(Key, buffersize, IPC_CREAT | 0600); char *addr; addr = (char *)shmat(pid, NULL, 0); printf(receive msg is:%sn, addr); shmdt(addr); else int pid; pid = shmget(Key, buffersize, IPC_CREAT | 0600); char *addr; addr = (char *)shmat(pid, NULL, 0); strcpy(addr, This is the message which the parent have sent!); shmdt(addr); return 0;实验结果:显示:receive msg is:This is the message which the parent have sent!分析:shm.c程序的不同之处是在内存中开辟了内存区域,并通过shmget()获得该共享内存的id号,然后用shmat()把共享内存链接到addr处,实现数据的交换和共享,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论