




已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.,1,linux进程间通信,进程间通信概述管道通信信号共享内存消息队列,.,2,1、进程间通信概述,进程间通信有如下一些目的:数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。,.,3,linux进程间通信(IPC)由以下几部分发展而来:早期UNIX进程间通信、基于SystemV进程间通信、基于Socket进程间通信和POSIX进程间通信。UNIX进程间通信方式包括:管道、FIFO、信号。SystemV进程间通信方式包括:SystemV消息队列、SystemV信号灯、SystemV共享内存。POSIX进程间通信包括:posix消息队列、posix信号灯、posix共享内存。,.,4,现在linux使用的进程间通信方式:(1)管道(pipe)和有名管道(FIFO)(2)信号(signal)(3)消息队列(4)共享内存(5)信号量(6)套接字(socket),.,5,2、管道通信,普通的Linuxshell都允许重定向,而重定向使用的就是管道。例如:ps|grepvsftpd管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的首端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。管道主要用于不同进程间通信。,.,6,2.1管道创建与关闭,创建一个简单的管道,可以使用系统调用pipe()。它接受一个参数,也就是一个包括两个整数的数组。如果系统调用成功,此数组将包括管道使用的两个文件描述符。创建一个管道之后,一般情况下进程将产生一个新的进程。系统调用:pipe();原型:intpipe(intfd2);返回值:如果系统调用成功,返回0。如果系统调用失败返回-1:errno=EMFILE(没有空闲的文件描述符)EMFILE(系统文件表已满)EFAULT(fd数组无效),.,7,注意:fd0用于读取管道,fd1用于写入管道。,图1linux中管道与文件描述符的关系,.,8,#include#include#include#includeintmain()intpipe_fd2;if(pipe(pipe_fd)0将信号发送给进程ID为pid的进程。pid=0将信号发送给其进程组ID等于发送进程的进程组ID,而且发送进程有许可权向其发送信号的所有进程。pid0将信号发送给其进程组ID等于pid绝对值,而且发送进程有许可权向其发送信号的所有进程。如上所述一样,“所有进程”并不包括系统进程集中的进程。pid=-1POSIX.1未定义此种情况。,.,28,3.2.2alarm和pause函数,使用alarm函数可以设置一个时间值(闹钟时间),在将来的某个时刻该时间值会被超过。当所设置的时间值被超过后,产生SIGALRM信号。如果不忽略或不捕捉此信号,则其默认动作是终止该进程。#includeunsignedintalarm(unsignedintseconds);返回:0或以前设置的闹钟时间的余留秒数,.,29,参数seconds的值是秒数,经过了指定的seconds秒后会产生信号SIGALRM。每个进程只能有一个闹钟时间。如果在调用alarm时,以前已为该进程设置过闹钟时间,而且它还没有超时,则该闹钟时间的余留值作为本次alarm函数调用的值返回。以前登记的闹钟时间则被新值代换。如果有以前登记的尚未超过的闹钟时间,而且seconds值是0,则取消以前的闹钟时间,其余留值仍作为函数的返回值。,.,30,pause函数使调用进程挂起直至捕捉到一个信号。#includeintpause(void);返回:-1,errno设置为EINTR只有执行了一个信号处理程序并从其返回时,pause才返回。,.,31,3.3信号的处理,当系统捕捉到某个信号时,可以忽略该信号或是使用指定的处理函数来处理该信号,或者使用系统默认的方式。信号处理的主要方法有两种,一种是使用简单的signal函数,另一种是使用信号集函数组。,.,32,3.3.1signal(),#includevoid(*signal(intsigno,void(*func)(int)(int)返回:成功则为以前的信号处理函数指针,若出错则为SIG_ERRfunc的值是:(a)常数SIG_IGN,或(b)常数SIG_DFL,或(c)当接到此信号后要调用的函数的地址。如果指定SIG_IGN,则向内核表示忽略此信号(有两个信号SIGKILL和SIGSTOP不能忽略)。如果指定SIG_DFL,则表示接到此信号后的动作是系统默认动作。当指定函数地址时,我们称此为捕捉此信号。我们称此函数为信号处理程序(signalhandler)或信号捕捉函数(signal-catchingfunction)。,.,33,3.3.2信号集函数组,我们需要有一个能表示多个信号信号集(signalset)的数据类型。将在sigprocmask()这样的函数中使用这种数据类型,以告诉内核不允许发生该信号集中的信号。信号集函数组包含几大模块:创建函数集、登记信号集、检测信号集。,.,34,图4信号操作一般流程,SigemptysetSigaddset,Sigprocmask,定义信号集,设置信号屏蔽位,sa_masksa_handlersigaction,Sigpending,定义信号处理函数,测试信号,.,35,创建函数集,#includeintsigemptyset(sigset_t*set);intsigfillset(sigset_t*set);intsigaddset(sigset_t*set,intsigno);intsigdelset(sigset_t*set,intsigno);四个函数返回:若成功则为0,若出错则为-1intsigismember(constsigset_t*set,intsigno);返回:若真则为1,若假则为0。,.,36,sigemptyset:初始化信号集合为空。sigfillset:初始化信号集合为所有信号的集合。sigaddset:将指定信号添加到现存集中。sigdelset:从信号集中删除指定信号。sigismember:查询指定信号是否在信号集合中。,.,37,登记信号集,登记信号处理机主要用于决定进程如何处理信号。首先要判断出当前进程阻塞能不能传递给该信号的信号集。这首先使用sigprocmask函数判断检测或更改信号屏蔽字,然后使用sigaction函数改变进程接受到特定信号之后的行为。,.,38,一个进程的信号屏蔽字可以规定当前阻塞而不能递送给该进程的信号集。调用函数sigprocmask可以检测或更改(或两者)进程的信号屏蔽字。#includeintsigprocmask(inthow,constsigset_t*set,sigset_t*oset);返回:若成功则为0,若出错则为-1oset是非空指针,进程的当前信号屏蔽字通过oset返回。其次,若set是一个非空指针,则参数how指示如何修改当前信号屏蔽字。,.,39,用sigprocmask更改当前信号屏蔽字的方法,how参数设定:SIG_BLOCK该该进程新的信号屏蔽字是其当前信号屏蔽字和set指向信号集的并集。set包含了我们希望阻塞的附加信号。SIG_UNBLOCK该该进程新的信号屏蔽字是其当前信号屏蔽字和set所指向信号集的交集。set包含了我们希望解除阻塞的信号。SIG_SETMASK该该进程新的信号屏蔽是set指向的值。如果set是个空指针,则不改变该进程的信号屏蔽字,how的值也无意义。,.,40,sigaction函数的功能是检查或修改(或两者)与指定信号相关联的处理动作。此函数取代了UNIX早期版本使用的signal函数。#includeintsigaction(intsigno,conststructsigaction*act,structsigaction*oact);返回:若成功则为0,若出错则为-1参数signo是要检测或修改具体动作的信号的编号数。若act指针非空,则要修改其动作。如果oact指针非空,则系统返回该信号的原先动作。此函数使用下列结构:structsigactionvoid(*sa_handler)(intsigno);sigset_tsa_mask;intsa_flags;void(*sa_restore);,.,41,sa_handler是一个函数指针,指定信号关联函数,可以是自定义处理函数,还可以SIG_DFL或SIG_IGN。sa_mask是一个信号集,它可以指定在信号处理程序执行过程中哪些信号应当被阻塞。sa_flags中包含许多标志位,是对信号进行处理的各种选项。具体如下:SA_NODEFERSA_NOMASK:当捕捉到此信号时,在执行其信号捕捉函数时,系统不会自动阻塞此信号。SA_NOCLDSTOP:进程忽略子进程产生的任何SIGSTOP、SIGTSTP、SIGTTIN和SIGTTOU信号SA_RESTART:可让重启的系统调用重新起作用。SA_ONESHOTSA_RESETHAND:自定义信号只执行一次,在执行完毕后恢复信号的系统默认动作。,.,42,检测信号集,检测信号是信号处理的后续步骤,但不是必须的。sigpending函数运行进程检测“未决”信号(进程不清楚他的存在),并进一步决定对他们做何处理。sigpending返回对于调用进程被阻塞不能递送和当前未决的信号集。#includeintsigpending(sigset_t*set);返回:若成功则为0,若出错则为-1,.,43,4、共享内存,共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。,.,44,图5共享内存原理示意图,.,45,共享内存实现分为两个步骤:一、创建共享内存,使用shmget函数。二、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。,.,46,系统调用:shmget();原型:intshmget(key_tkey,intsize,intshmflg);返回值:如果成功,返回共享内存段标识符。如果失败,则返回-1:errno=EINVAL(无效的内存段大小)EEXIST(内存段已经存在,无法创建)EIDRM(内存段已经被删除)ENOENT(内存段不存在)EACCES(权限不够)ENOMEM(没有足够的内存来创建内存段),.,47,系统调用:shmat();原型:intshmat(intshmid,char*shmaddr,intshmflg);返回值:如果成功,则返回共享内存段连接到进程中的地址。如果失败,则返回-1:errno=EINVAL(无效的IPCID值或者无效的地址)ENOMEM(没有足够的内存)EACCES(存取权限不够),.,48,当一个进程不在需要共享的内存段时,它将会把内存段从其地址空间中脱离。系统调用:shmdt();调用原型:intshmdt(char*shmaddr);返回值:如果失败,则返回-1:errno=EINVAL(无效的连接地址),.,49,5.消息队列,消息队列就是消息的一个链表,它允许一个或多个进程向它写消息,一个或多个进程从中读消息。具有一定的FIFO的特性,但是可实现消息的随即查询。这些消息存在于内核中,由“队列ID”来标识。消息队列的实现包括创建和打开队列、添加消息、读取消息和控制消息队列这四种操作。msgget:创建和打开队列,其消息数量受系统限制。msgsnd:添加消息,将消息添加到消息队列尾部。msgrcv:读取消息,从消息队列中取走消息。msgctl:控制消息队列。,.,50,intmsgget(key_tkey,intflag)key:返回新的或已有队列的ID,IPC_PRIVATEintmsgsnd(intmsqid,structmsgbuf*msgp,size_tmsgsz,intflag)其中:msqid是消息队列的队列ID;msgp是消息内容所在的缓冲区;msgsz是消息的大小;msgflg是标志,IPC_NOWAIT若消息并没有立交发送而调用进程会立即返回。,.,51,structmsgbuflongmtype;/*typeofmessage*/charmtext1;/*messagetext*/;,.,52,intmsgrcv(intmsqid
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省揭阳市空港经济区2026届九上化学期中综合测试试题含解析
- 山东省日照市东港区新营中学2024-2025学年部编版七年级下学期历史期中考试题(含答案)
- 2026届四川省自贡市曙光中学化学九年级第一学期期末达标检测试题含解析
- 2026届广东省茂名市直属学校英语九上期末联考模拟试题含解析
- 2026届福建省厦门市四校化学九年级第一学期期中质量检测试题含解析
- 旅游景区物业经营权及旅游服务合作协议
- 离婚协议书中个人债务分担协议书范本
- 专科康复治疗学考试题及答案
- 珠宝拍卖代理合同及拍卖规则及流程清单
- 专技十三级考试题目及答案
- 2023年药师技能竞赛
- 矿井通风工题库汇总
- TSZUAVIA 009.5-2019 多旋翼无人机系统实验室环境试验方法 第5部分:高温试验
- GB/T 23445-2009聚合物水泥防水涂料
- GB 10343-2008食用酒精
- 新员工入职安全培训ppt
- 房产证模板表格
- 小粒咖啡栽培技术措施课件
- 曲顶柱体的体积市公开课金奖市赛课一等奖课件
- 2022年东台市城市建设投资发展集团有限公司招聘笔试题库及答案解析
- 民法典侵权责任编课件
评论
0/150
提交评论