




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
5.1Linux下进程间通信概述
Linux下的进程间通信方式主要有:(1)管道(pipe)管道分为无名管道和有名管道,无名管道只能用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信,而有名管道除具有无名管道具有的功能外,还能用于无亲属关系的进程间的通信。
(2)信号(signal)信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身。Linux除了支持Unix早期信号语义函数signal外,还支持语义符合Posix.1标准的信号函数sigaction。
(3)消息队列消息队列是消息的链接表,包括Posix消息队列systemV消息队列。它克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点,使具有写权限的进程可以向队列中添加消息,具有读权限的进程可以读取队列中的消息。
(4)共享内存共享内存是最有用的进程间通信方式,它使得多个进程可以访问同一块内存空间。它往往需要与其它通信机制结合,如与信号量结合使用可实现进程间的同步与互斥。
(5)内存映射(mappedmemory)内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
(6)信号量(semaphore)主要作为进程间以及同一进程不同线程之间的同步手段。
(7)套接字(socket)应用更为广泛的进程间通信机制,可用于不同机器之间的进程间通信。所有提供了TCP/IP协议栈的操作系统几乎都提供了套接字,而所有这样操作系统,对套接字的编程方法几乎是完全一样的。
5.2管道通信5.2.1管道概述管道是Linux支持的最初UnixIPC形式之一,具有以下特点:(1)管道是半双工的通信模式,数据只能向一个方向流动。(2)只能用于具有亲缘关系的进程间的通信,即父子进程或者兄弟进程之间。(3)管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是单独构成一种文件系统,并且只存在与内存中。
5.2.2管道创建与关闭创建管道可以通过调用pipe函数来实现。pipe函数的语法要点如下:头文件:#include<unistd.h>函数原型:intpipe(intfd[2])
pipe函数通过传入两个文件描述符来创建管道,调用成功时返回0,否则返回-1。
5.2.3管道读写一般文件的I/O函数都可以用于管道,如close、read、write等等。
5.2.4标准流管道系统提供了一个popen函数来完成标准流管道的一系列创建过程;
popen函数的使用可大大减少代码的编写量,但是创建管道时缺少灵活性,该函数只能支持标准的I/O函数,不能使用read、write这类不带缓冲的I/O函数。关闭标准流管道使用pclose函数来完成,该函数关闭标准I/O流,并等待命令执行结束。
5.2.5FIFO命名管道(namedpipes),因为这种管道的操作方式基于“先进先出”原理,也称为FIFO(FirstInFirstOut)在程序中调用mkfifo函数创建FIFO管道,mkfifo函数调用的原型为:
#include<sys/types.h>#include<sys/state.h>intmkfifo(constchar*filename,mode_tmode);
5.3信号机制5.3.1信号概述1.信号及信号来源信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的。信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源,最常用发送信号的系统函数是kill、raise、alarm、setitimer和sigqueue函数,软件来源还包括一些非法运算等操作。
2.信号的种类可以从两个不同的分类角度对信号进行分类:(1)可靠性方面:可靠信号与不可靠信号;(2)与时间的关系上:实时信号与非实时信号。
3.进程对信号的响应进程对信号的响应有以下三种方式:(1)忽略信号,即对信号不做任何处理,但是有两个信号不能忽略,即SIGKILL和SIGSTOP。(2)捕捉信号,定义信号处理函数,当信号发生时,执行相应的处理函数。(3)执行缺省操作,Linux对每种信号都规定了默认操作。
5.3.2信号的发送1.kill()和raise()kill函数和kill系统命令一样,可以发送信号给进程或者进程组。它不仅可以终止进程,还可以向进程发送其他信号。与kill函数不同,raise函数允许向其自身发送信号。kill函数相关语法要点:头文件:#include<sys/types.h>和#include<signal.h>函数原型:intkill(pid_tpid,intsigno)
raise函数相关语法要点:头文件:#include<sys/types.h>和#include<signal.h>函数原型:intraise(intsigno)
2.alarm()和pause()alarm函数可以在进程中设置一个定时器,当定时器指定的时间到达时,它就向进程发送SIGALARM信号。一个进程只有一个闹钟时间,如果在调用alarm之前已经设置过闹钟时间,则新设置的闹钟时间会替代以前设置的闹钟时间。alarm函数相关语法要点:头文件:#include<unistd.h>函数原型:unsignedintalarm(unsignedintseconds)
pause函数是用于将调用进程挂起直至捕捉到信号为止,通常可用于判断信号是否已到。pause函数相关语法要点:头文件:#include<unistd.h>函数原型:intpause(void)函数返回值:返回值为-1,并把error值设为EINTR。
3.sigqueue()sigqueue函数是比较新的发送信号系统调用,主要是针对实时信号提出的(当然也支持前32种),支持信号带有参数,与函数sigaction()配合使用。sigqueue函数相关语法要点:头文件:#include<sys/types.h>和#include<signal.h>函数原型:intsigqueue(pid_tpid,intsigno,constunionsigvalval)
4.setitimer()sigqueue函数是比较新的发送信号系统调用,主要是针对实时信号提出的(当然也支持前32种),支持信号带有参数,与函数sigaction()配合使用。sigqueue函数相关语法要点:头文件:#include<sys/time.h>函数原型:intsetitimer(intwhich,conststructitimerval*value,structitimerval*ovalue))
5.3.3信号的处理Linux主要有两个函数实现信号的处理:signal()、sigaction()。1.signal函数signal函数相关语法要点:头文件:#include<signal.h>函数原型:void(*signal(intsignum,void(*handler)(int)))(int)
2.信号集函数组信号集被定义为一种数据类型:typedefstruct{unsignedlongsig[_NSIG_WORDS];
}sigset_t
信号集用来描述信号的集合,Linux所支持的所有信号可以全部或部分的出现在信号集中,主要与信号阻塞相关函数配合使用。
5.4共享内存5.4.1共享内存概述SystemV进程间通信(IPC)包括3种机制:消息队列、信号量、共享内存。SystemV共享内存把共享数据放在共享内存区域,任何想要访问该数据的进程通过共享该内存区域来获得访问权。SystemV共享内存通过shmget获得或创建一个IPC共享内存区域,并返回相应的标识符。
5.4.2共享内存的实现1.接口函数
SystemV为共享内存主要定义了fork()、shmget()、shmat()、shmdt()和shmctl()几个API接口函数fork函数用于生成一个键值:key_tkey;shmget函数用于创建(或者获取)一个由key键值指定的共享内存对象;
shmat函数用于建立调用进程与由标识符shmid指定的共享内存对象之间的连接,返回被映射的段地址;shmdt函数用于断开调用进程与共享内存对象之间的连接;shmctl函数用于对已创建的共享内存对象进行查询、设值、删除等操作.2.实例
5.5消息队列5.5.1消息队列概述消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。用户可以从消息队列中添加消息、读取消息。
下图说明了内核与消息队列是怎样建立起联系的。其中:structipc_idsmsg_ids是内核中记录消息队列的全局数据结构;structmsg_queue是每个消息队列的队列头。
5.5.2消息队列的实现1.接口函数
SystemV为消息队列的实现主要定义了msgget()、msgsnd()、msgrcv()和msgctl()几个API接口函数msgget函数用于创建或打开消息队列msgsnd函数用于发送消息msgrcv函数用于读取消息msgctl函数用于对由msqid标识的消息队列执行cmd操作
2.实例实例首先使用msgget函数创建一个新的消息队列,接着使用msgsnd函数添加一个消息到消息队列,然后使用msgrcv函数从消息队列中读取消息,最后使用msgctl函数删除该消息队列。
5.6信号量信号量用于保护系统中关键的代码或者数据结构。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学课本中的自然科普知识解读
- 高考政治主观题答题大招+得分思路与技巧
- 三农资源开发与利用战略方案详解书
- 牛场场地租赁合同
- 仓储物流中心建设及运营合同
- 重阳节养老策划书(3篇)
- 六一幼儿园主题活动策划方案(10篇)
- 出纳述职报告
- DB31∕701-2020 有色金属铸件单位产品能源消耗限额
- 车载消防知识培训课件
- 小组合作学习班级评价表
- 某公司新员工入职登记表格
- APQP新产品开发计划ABCD表
- SAP-QM质量管理模块前台操作详解(S4系统)
- 《民法典》婚姻家庭编解读之夫妻共同债务(1064条)
- 初中学生数学学习状况问卷调查及分析报告
- 贝壳房屋租赁合同标准版
- 幼儿游戏活动指导第二版全套教学课件
- 大学生就业指导实用教程:就业权益与法律保障
- 基于主题意义探究的小学英语单元整体作业设计 论文
- 新概念英语第2册课文word版
评论
0/150
提交评论