- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验四 进程间通信
一、实验目的
掌握利用管道机制实现进程间的通信的方法
掌握利用消息缓冲队列机制实现进程间的通信的方法
掌握利用共享存储区机制实现进程间的通信的方法
了解Linux系统中进程软中断通信的基本原理
二、实验学时
2学时
三、实验内容
1.掌握实现进程间通信的系统调用的功能和方法
进程通信,是指进程之间交换信息。从这个意义上讲,进程之间的同步、互斥也是一种信息交换,也是一种通信。但是,这里所说的“通信”是指进程之间交换较多的信息这样一种情况,特别是在由数据相关和有合作关系的进程之间,这种信息交换是十分必要和数量较大的。
进程间通信是协调解决多个进程之间的约束关系,实现进程共同进展的关键技术,是多道系统中控制进程并发执行必不可少的机制。
(1)进程的通信方式:
a. 直接通信是指信息直接传递给接收方,如管道。在发送时,指定接收方的地址或标识,也可以指定多个接收方或广播式地址, send(Receiver, message)。在接收时,允许接收来自任意发送方的消息,并在读出消息的同时获取发送方的地址, receive(Sender,message)。
b. 间接通信:借助于收发双方进程之外的共享数据结构作为通信中转,如消息队列。这种数据结构称为缓冲区或信箱。通常收方和发方的数目可以是任意的。
(2)进程间通信的类型:
a. 共享存储器系统:基于共享数据结构的通信方式:只能传递状态和整数值(控制信息),包括进程互斥和同步所采用的信号量机制。速度快,但传送信息量小,编程复杂,属于低级通信;基于共享存储区的通信方式:能够传送任意数量的数据,属于高级通信。
b. 消息传递系统:在消息传递系统中,进程间的数据交换以消息为单位,用户直接利用系统提供的一组通信命令(原语)来实现通信。
c. 管道通信:管道是一条在进程间以字节流方式传送的通信通道。它由OS 核心的缓冲区(通
常几十KB)来实现,是单向的;在实质上,是一个有OS 维护的特殊共享文件,常用于命
令行所指定的输入输出重定向和管道命令。在使用管道前要建立相应的管道,然后才可使用。
(3)Linux 管道
a. 无名管道:一个可以在文件系统中长期存在的、具有路径名的文件。用系统调用mknod( )建立。它克服无名管道使用上的局限性,可让更多的进程也能利用管道进行通信。因而其它进程可以知道它的存在,并能利用路径名来访问该文件。对有名管道的访问方式与访问其他文件一样,需先用open( )打开。通过pipe 系统调用可以创建无名管道,得到两个文件描述符,分别用于写和读。
– int pipe(int fd[2]); //头文件unistd.h,返回值:0(成功),-1(发生错误)
– 文件描述符 fd[0]为读端,fd[1]为写端
– 通过系统调用 write 和read 进行管道的写和读
read(fd,buf,nbyte)从fd所指示的文件中读出nbyte个字节的数据,并将它们送至由指针buf所指示的缓冲区中。如该文件被加锁,等待,直到锁打开为止。write(fd,buf,nbyte)把nbyte 个字节的数据,从buf所指向的缓冲区写到由fd所指向的文件中。如文件加锁,暂停写入,直至开锁。
参数定义:int read(fd,buf,nbyte); /* write(fd,buf,nbyte)参数定义同read*/
int fd;
char *buf;
unsigned nbyte;
– 进程间双向通信,通常需要两个管道
– 只适用于父子进程之间或父进程安排的各个子进程之间
b. Linux 中的有名管道,可通过mknod 系统调用建立:指定mode 为S_IFIFO,或调用C 库函数mkfifo 产生
– int mknod(const char *path, mode_t mode, dev_t dev)
– int mkfifo(const chat *path, mode_t mode)
(4)消息缓冲机制
消息(message) 与窗口系统中的“消息”不同。通常是不定长数据块。消息的发送不需要接收方准备好,随时可发送。相应的数据结构:
type message buffer = record
sender
size
text
next
end
Linux 消息:
消息队列(message queue):每个message 不定长,由类型(type)和正文(text)组成
Linux 消息队列API:头文件sys/types.h, sys/ipc.h, sys/msg.h
–msgget 依据用户给出的整数值key,创建新消息队列或打开现有消息队列,返回一个消息
队列 ID;
–msgsnd 发送消息;
–msgrcv 接收消息,可以指定消息类型;没有消息时
文档评论(0)