版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验六进程间通信实验六 进程间通信 v预备知识Linux进程间通信进程软中断通信管道和消息队列v实验指导软中断通信函数管道通信的使用消息队列的应用v实验目的、内容1.1 Linux进程间通信v实现数据传输、数据共享、事件通知、资源共享和进程控制等vLinux的进程间通信方式管道(Pipe)和有名管道(Named Pipe)信号(Signal)消息(Message)队列共享内存信号量(Semaphore)套接口(Socket)1.1 Linux进程间通信管道和有名管道v管道用于具有亲缘关系进程间的通信管道是半双工的,数据只能单向流动(双方通信需建立两个管道)管道只能用于父子进程或兄弟进程之间管道
2、对于管道两端的进程而言就是一个文件,并单独构成一种文件系统,存在于内存中写管道的内容添加在管道缓冲区的末尾,读管道则从缓冲区头部读出v有名管道在普通管道具备功能基础上,通过给管道命名的方法变成管道文件,允许无亲缘关系进程间通过访问管道文件进行通信1.1 Linux进程间通信信号v在一个或多个进程之间传递异步信号v类似于Windows下的消息,用于通知接收进程有某种事件发生v当某个信号出现时,系统有三种处理方式:忽略信号:大多数信号使用,但SIGKIL和SIGSTOP不能被忽略捕捉信号:通知内核在某种信号发生时,调用一个用户函数执行系统默认动作:异常终止(abort)、退出(exit)、忽略(i
3、gnore)、停止(stop)或继续(continue)1.1 Linux进程间通信消息队列v也叫报文队列,是消息的链接表v有两种类型的消息队列:POSIX消息队列和系统V消息队列v运行于同一台机器上的进程间通信,与管道类似v消息内存可根据需要自行定义,可忽略信号承载信息量少、管道只能承载无格式字节流以及缓冲区大小受限等缺点v可以用流管道或套接口方式取代1.1 Linux进程间通信共享内存v在系统内核分配一块缓冲区,多个进程都可以访问该缓冲区v效率高:进程可以直接读写内存,不需任何数据拷贝,避免了内核空间与用户空间的切换v同步和协议都不受程序员控制,必须确保将句柄传递给子进程和线程,需与其它通
4、信机制结合使用,来达到进程间的同步及互斥v多用于存储应用程序的配置信息1.1 Linux进程间通信信号量v也称信号灯,用来协调不同进程间的数据对象v提供对进程间共享资源访问控制的手段,用来保护共享资源v还可用于进程间及同一进程不同线程间的进程同步v两种类型二值信号灯:取值只能为0或1,类似于互斥锁计算信号灯:取值可以为任意非负值(受内核本身约束)1.1 Linux进程间通信套接口v也称套接字,用于不同机器之间的进程间通信v通信域是用来说明套接口通信的协议,创建套接口时要指明它的通信域v常见的有:UNIX域套接口、网际通信域v系统的网络编程接口,以文件的形式实现(属于sockfs特殊文件系统)1
5、.2 进程软中断通信v即信号,提供一种简单的处理异步事件的方法v信号机制是对中断机制的一种模拟,又称为软中断v信号与中断的相似点采用了相同的异步通信方式当检测出有信号或中断请求时,暂停正在执行的程序而转去执行相应的处理程序处理完毕后返回到原来的断点对信号或中断可以进行屏蔽v信号与中断的区别中断有优先级,而信号没有优先级,所有的信号都是平等的信号处理程序在用户态下运行,而中断处理程序在核心态下运行中断响应是及时的,而信号响应通常都有较大的时间延迟1.2 进程软中断通信信号机制的功能v发送信号发送进程把信号送到指定进程信号域的某一位上,如目标进程正在一个可被中断的优先级上睡眠,核心便将其唤醒v预置
6、对信号的处理方式进程处于核心态时,即使受到软中断也不予理睬;只有当它返回到用户态后,才处理软中断信号v收受信号的进程按事先规定完成对相应事件的处理1.3 管道和消息队列无名管道int pipe(int fd2);一般的文件I/O函数都可用v读数据规则若管道的写端不存在,读出字节数为0写端存在时,若请求字节数大于PIPE_BUF,则返回管道中的现有数据;否则返回请求的字节数v写入规则不保证写入的原子性,若有空闲区域,写进程就会试图写入管道,若读进程不读走数据,则写操作将一直阻塞管道读端存在时,写入数据才有意义;否则,写进程将收到内核传来的SIFPIP信号,应用程序处理该信号或忽略(默认终止应用程
7、序)1.3 管道和消息队列命名管道(1)int mkfifo(const char * pathname, mode t_mode);v增加了打开操作:若当前打开操作是为读而打开,若已有进程为写而打开,则打开成功;否则,阻塞直到有相应进程为写而打开(设置了阻塞标识),或成功返回(未设置阻塞标识)若当前打开操作是为写而打开,若已有进程为读而打开,则打开成功;否则,阻塞直到有进程为读而打开(设置了阻塞标识),或返回ENXIO错误(未设置阻塞标识)1.3 管道和消息队列命名管道(2)v约定:如果进程为了从FIFO中读取数据而阻塞打开FIFO,那么称该进程内的读操作为设置了阻塞标志的读操作 如果进程为
8、了向FIFO中写入数据而阻塞打开FIFO,那么称该进程内的写操作为设置了阻塞标志的写操作 v读数据规则若有进程写打开FIFO,且当前FIFO中无数据,则对于设置了阻塞标志的读操作,将一直阻塞;对无阻塞标志的读操作则返回-1读打开的阻塞标志只对本进程第一个读操作施加作用,如果有多个读操作序列,则在第一个读操作被唤醒并完成后,后续的读操作将不再阻塞如果没有进程写打开,则设置了阻塞标志的读操作阻塞1.3 管道和消息队列命名管道(3)v对于设置了阻塞标志的写操作:当要写入的数据量不大于PIPE_BUF时,若管道空闲缓冲区不足以容纳要写入的字节数,则睡眠,直到缓冲区满足要求时,一次性写操作(原子性) 当
9、要写入的数据量大于PIPE_BUF时,缓冲区一有空闲区域,写进程就会试图写入数据,在写完所有请求写的数据后返回(非原子性) v对于没有设置阻塞标志的写操作:当要写入的数据量大于PIPE_BUF时,在写满所有FIFO空闲缓冲区后,写操作返回(非原子性) 当要写入的数据量不大于PIPE_BUF时,若当前FIFO空闲缓冲区能够容纳请求写入的字节数,写完后成功返回;若当前FIFO空闲缓冲区不能容纳请求写入的字节数,则返回EAGAIN错误(原子性) 1.3 管道和消息队列消息队列v消息的链表,有写权限的进程可以向队列中按照一定的规则添加新消息;有读权限的进程则可以从消息队列中读出信息v消息队列是一个临界
10、资源,读写操作必须互斥执行v消息队列独立于发送和接收进程,减少了在打开和关闭有名管道之间同步的困难v消息队列的操作:打开或创建操作读写操作获得或设置消息队列属性实验六 进程间通信 v预备知识Linux进程间通信进程软中断通信管道和消息队列v实验指导软中断通信函数管道通信的使用消息队列的应用v实验目的、内容2.1 软中断通信函数(1)v向一个进程或一组进程发送一个信号:int kill(pid, sig)pid0时,核心将信号发送给进程pidpid0时,核心将信号发送给与发送进程同组的所有进程pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程v预置信号接收后的处
11、理方式:signal(sig, function)function=1时,屏蔽该类信号function=0时,收到sig信号后终止自己function为非0、非1类整数时,执行用户设置的软中断处理程序2.1 软中断通信函数(2)vpid_t wait(int * status)暂时停止目前进程的执行,直到有信号来或子进程结束vpid_t waitpid(pid_t pid, int * status, int options)pid的取值vpid=-1时,等待任何一个子进程退出,相当于wait()vpid=0时,等待进程组ID与目前进程相同的任何子进程vpid-1时,等待进程组ID为pid绝对
12、值的任何子进程options有两个常数参数,可使用或运算,不用时设为0vWNOHANG:即使没有任何子进程退出,它也会立即返回vWUNTRACED:子进程进入暂停执行状态并马上返回,但结束状态不予以理会2.2 管道通信的使用无名管道的使用v将数据写入管道:write()管道长度受到限制,管道满时写入操作将被阻塞,直到管道中的数据被读取fcntl()可将管道设置为非阻塞模式v从管道读取数据:read()当数据被读取后,数据将自动被管道清除不能由一个进程向多个进程同时传递同一个数据fcntl()可将管道读模式设置为非阻塞模式v关闭管道:close()关闭读端口时,在管道上进行写操作的进程将收到SI
13、GPIPE信号关闭写端口时,进行读操作的read()函数将返回02.2 管道通信的使用命名管道的创建与读写v创建命名管道:int mknod(const char *path, mode_t mod, dev_t dev);int mkfifo(const char *path, mode_t mode);v命名管道必须先调用open()将其打开同时用读写方式(O_RDWR)打开时,一定不会导致阻塞 以只读方式(O_RDONLY)打开时,调用open()函数的进程将会被阻塞直到有写方打开管道 以写方式(O_WRONLY)打开时,阻塞直到有读方打开管道 2.3 消息队列的应用v消息队列的创建:m
14、sgget(key_t key, int msgflg);v消息的发送:msgsnd(int msgqid, const void *msgp_ptr, size_t msg_sz, int msgflg);v消息的接收:msgrcv(int msgqid, void *msgp_ptr, size_t msg_sz, long int msgtype, int msgflg);v消息队列的控制和撤销:msgctl(int msgqid, int cmd, struct msqid_ds *buf);实验六 进程间通信 v预备知识Linux进程间通信进程软中断通信管道和消息队列v实验指导软中断
15、通信函数管道通信的使用消息队列的应用v实验目的、内容3.1 实验目的v掌握Linux系统进程软中断通信的基本原理和实现方法v了解管道通信的特点,掌握管道通信的使用方法v了解消息队列通信机制及原理,掌握消息队列相关系统调用的使用方法及功能3.2 实验内容(1)v进程的信号通信编写程序。用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘的中断信号(即按Del键);捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:Child process 1 is killed by parent.Child process 2 is killed by parent.父进程等待两个子进程终止后,输出如下信息后终止:Parent process is killed.然后在程序中,增加语句signal(SIGINT, SIG_IGN)和语句signal(SIGQUIT, SIG_IGN),观察执行结果是否有变化,并分析原因。3.2 实验内容(2)v进程的管道通信编写程序,实现进程的管道通信:父进程使用系统
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 员工工位调整安排
- 电影产业园租赁合同
- 珠宝行业合同归档方案
- 危险品事故应急法规
- 校园道路铺设工程合同
- 水产加工鱼塘施工合同模板
- 建筑绿化工程劳务分包合同
- 商业综合体合同
- 旅游发展专项资金管理办法
- 建筑智能化交货期承诺书范本
- 2023年国家电力投资集团公司招聘笔试题库及答案解析
- 高中生物植物激素调节第一轮复习公开课教学设计与反思
- GB/T 2885.6-2008矿用窄轨车辆第6部分:材料车
- GB/T 1393-1987舷梯翻梯装置
- 《直线与圆锥曲线的综合问题》示范公开课教学课件【高中数学北师大】
- 人体衰老和抗衰老研究 课件
- 新城吾悦广场商业封顶仪式策划方案
- 《故都的秋》《荷塘月色》《我与地坛(节选)》群文阅读 导学案 统编版高中语文必修上册
- 桡骨远端骨折中医治疗培训课件
- 例说议题式课堂教学的模式课件
- 小学数学北师大三年级上册五周长围篱笆
评论
0/150
提交评论