版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第7章章进 程 通 信2本章重点q 进程通信中信号的概念及信号处理q 进程间的管道通信编程q 进程间的内存共享编程q 进程间的队列通信编程3 7.1 进程间通信q 每个进程有不同的进程地址空间,进程之间要交换数据必须通过内核。q 在内核中开辟一块缓冲区,P1进程把数据从用户空间拷贝到内核缓冲区,P2进程再从内核缓冲区把数据读走。q 内核提供的这种机制称为进程间的通信(IPC, InterProcess Communication)(见下图)q 实现进程间通信的方法:信号(signal)、管道(pipe)、套接字(socket)、System V IPC 机制(消息队列、信号量、共享内存)进程
2、1 P1进程2 P2信号、管道、队列、共享内存等用户空间内核空间4 7.2 信号q 信号是Linux系统中用于进程之间相互通信或操作的一种机制。q 信号可以在任何时候发给某一进程,而无需知道该进程的状态。如果该进程当前处于未执行的状态,则该信号由内核保存起来,直到该进程恢复执行,则将信号传递给该进程;如果一个信号被进程设置为阻塞,则该信号被延迟传递,直到阻塞被取消时,信号才被传递给进程。q 使用信号时,应包含头文件5 7.2 信号7.2.1 信号及其使用简介q 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式(异步通信:发送端可以在任意时刻开始发送字符,所发送的字符之间的时间间隔可以
3、是任意的)q 信号可以在进程和内核之间直接交互,内核也可以利用信号来通知进程发生了哪些系统事件。q 信号事件的发生源有两个:硬件来源:+C,产生中断信号(SIGINT)软件来源:使用系统调用或者使用命令发出信号。发送信号的函数有:killraisealarmsetitimersigationsigqueue软件来源还包括一些非法运算操作6 7.2 信号7.2.1 信号及其使用简介q 例7.1 列出Linux系统所支持的所有信号列表q 信号值131以”SIG”开头;3449以”SIGRTMIN”开头(不可靠信号、非实时信号);5064以”SIGRTMAX”开头(可靠信号、实时信号)7 7.2 信
4、号7.2.1 信号及其使用简介q 例7.1 (续)q 可靠信号(5064):支持排队,信号发送给用户进程一次就注册一次;即使发现相同信号已经在进程中注册,也要再注册q 不可靠信号(131、3449):不支持排队,信号发送给用户进程后进行判断,如果发现相同信号已经在进程中注册,就不再注册,忽略该信号。信号产生内核进程信号注册信号处理信号注销用户进程信号的生命周期8 7.2 信号7.2.1 信号及其使用简介q 用户进程对信号的响应有三种方式:执行默认操作。Linux对每一种信号都规定了默认的操作捕捉信号。当信号发生时,执行所定义的信号处理函数(详见7.2.2节第2小结“信号处理”)忽略信号。当不希
5、望接收到的信号对进程的执行产生影响时,忽略该信号,即不对信号做任何处理;应用程序对SIGKILL、SIGSTOP无法捕捉和忽略,以便系统管理员能在任何时候中断或结束某一特定的进程。9 7.2 信号7.2.2 信号操作的相关函数kill:发送信号SIGKILL给进程或进程组raise:发送信号给进程或自身alarm:当定时器时间到时,向进程发送SIGALARM信号pause:没有捕捉到信号前一直将进程挂起signal:捕捉到信号SIGINT、SIG_IGN、SIG_DFL、SIGQUIT时执行信号处理函数sigemptyset:初始化信号集合为空sigfillset:初始化信号集合为所有信号集s
6、igaddset:将指定信号加入到指定集合sigdelset:将指定信号从信号集中删除sigismember:查询指定信号是否在信号集合之中sigprocmask:判断检测或更改信号屏蔽字10 7.2 信号7.2.2 信号操作的相关函数信号发送信号发送的关键:q 让系统知道哪个进程发送信号、发送什么信号q 能否向某一进程发送某一特定信号与用户的权限密切相关 例如,只有系统管理员才能向任何一个进程发送SIGKILL信号,以便终止该进程。alarm函数原型函数原型: int alarm(int seconds) 告诉内核在seconds秒之后给当前进程发SIGALRM信号,该信号的默认处理动作是终
7、止当前进程,函数返回值为0或距离所设定时间的秒数。11 7.2 信号7.2.2 信号操作的相关函数信号发送例7.2 下列程序应用函数alarm(10)在运行10秒后发送信号SIGALRM,程序接收到SIGALRM信号后被终止。12 7.2 信号7.2.2 信号操作的相关函数信号发送例7.2(续)运行结果:13 7.2 信号7.2.2 信号操作的相关函数1. 信号发送waitpid函数原型函数原型:pid_t waitpid(pid_t pid, int *status, int options);pid:子进程号status:子进程的状态options:可以为 0 或可以用“|”运算符把它们连
8、接起来使用,例如:ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);其中,WNOHANG表示,若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若结束,则返回该子进程的ID。WUNTRACED表示,若子进程进入暂停状态,则马上返回,但子进程的结束状态不予以理会。WIFSTOPPED(status)宏确定返回值是否对应于一个暂停子进程。参考:http:/ kill(pid_t pid, int sig);给特定的进程或进程组发送信号,执行成功则返回0,有错误则返回-1raise函数原型:函数原型:int raise(int sig);向进程
9、自身发送信号,执行成功则返回0,有错误则返回-114 7.2 信号7.2.2 信号操作的相关函数信号发送例7.3 创建一个子进程,父进程向子进程发出SIGKILL信号,子进程收到此信号后,结束其自身的运行。15 7.2 信号7.2.2 信号操作的相关函数信号发送例7.3 (续)创建一个子进程,父进程向子进程发出SIGKILL信号,子进程收到此信号后,结束其自身的运行。16 7.2 信号7.2.2 信号操作的相关函数信号发送例7.3(续)运行结果:17 7.2 信号7.2.2 信号操作的相关函数2. 信号处理 在编写程序代码时,对需要进程捕获的信号给出相应的处理程序代码。 一旦接收到此信号,则通
10、知系统调用相应的信号处理函数进行处理。signal函数原型:函数原型:void (*singal(int signum, void(* handler)(int)(int);定义返回函数指针的函数:return_type (*function(func_parameter_list) (parameter_list)定义了一个函数function,该函数的参数列表是(function_patameter_list),返回类型是一个函数指针,这个函数指针的原型是return_type(*)(parameter_list)。参考:http:/ 7.2 信号7.2.2 信号操作的相关函数2. 信号处
11、理signal函数原型:(续)函数原型:(续)void (*singal(int signum, void(* handler)(int)(int); singal() 依照参数signum指定的信号编号来设置该信号的处理函数。 当指定的信号到达时就会跳转到参数当指定的信号到达时就会跳转到参数handler指定的函数执行。指定的函数执行。 如果参数handler不是函数指针,则必须是下列两个常数之一:SIG_IGN 忽略参数signum指定的信号SIG_DFL将参数signum指定的信号重设为系统默认的信号处理方式 返回先前的信号处理函数指针signal函数的特点: 主要用于编号为131的非实
12、时信号的处理。 使用时只需把“欲处理的信号”、“处理函数”列出即可19 7.2 信号7.2.2 信号操作的相关函数2. 信号处理例7.4 程序运行后进入无限循环,当用户按下中断键(+C)时,进入自定义信号处理函数,再次按下中断键后,结束程序运行。20 7.2 信号7.2.2 信号操作的相关函数信号处理例7.4(续)运行结果:21 7.2 信号7.2.2 信号操作的相关函数3. 信号阻塞 当不希望进程在接收到信号时立刻中断执行,也不希望完全忽略此信号,而是希望延迟一段时间再去调用信号处理函数,此时需要用信号阻塞。信号阻塞需要用到下列信号集操作函数:#include int sigemptyset
13、(sigset_t *set); /初始化信号集,清零,不包含任何有效信号int sigfillset(sigset_t *set); /初始化信号集,置位,包含系统支持的所有信号注:在使用sigset_t类型的变量前,需要调用以上两个函数之一使得信号集处于确定状态int sigaddset(sigset_t *set , int signo); /在信号集中添加某个有效信号int sigdelset(sigset_t *set , int signo); /在信号集中删除某个有效信号注:以上4个函数执行成功则返回0,出错返回-1int sigismember(const sigset_t *
14、set, int signo); /判断一个信号集是否包含某种信号,包含则返回1,不包含则返回0,出错则返回-122 7.2 信号7.2.2 信号操作的相关函数3. 信号阻塞 当不希望进程在接收到信号时立刻中断执行,也不希望完全忽略此信号,而是希望延迟一段时间再去调用信号处理函数,此时需要用信号阻塞。信号阻塞需要用到下列信号集操作函数:(续)int sigprocmask(int how, const sigset_t *set, sigset _t*oldset);功能:查询或设置信号掩码,参数how有以下几种: SIG_BLOCK:将set所指向的信号集中所包含的信号加到当前的信号掩码中,
15、作为新的信号屏蔽字。 SIG_UNBLOCK:将参数set所指向的信号集中的信号从当前的信号掩码中移除,即解除对set所指向信号集中信号的屏蔽。 SIG_SETMASK:设置当前的信号掩码为参数set所指向的信号集中所包含的信号,即作为屏蔽字。 如果参数oldset不是NULL指针,那么目前的信号屏蔽字会由此指针返回。参考:http:/ 7.2 信号7.2.2 信号操作的相关函数3. 信号阻塞例7.5 主程序在运行时,即使按下中断键(+C),也不影响正在运行的程序,即让信号处于阻塞状态;当信号阻塞被解除以后方才进入自定义信号处理函数。运行结果如下:对于非实时信号:发现相同信号已在进程中注册,则忽略该信号24 7.2 信号7.2.2 信号操作的相关函数3. 信号阻塞例7.5 主程序在运行时,即使按下中断键(+C),也不影响正在运行的程序,即让信号处于阻塞状态;当信号阻塞被解除以后方才进入自定义信号处理函数。源
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度建筑工程泥工分包合同协议书
- 2024年药店实习生劳务聘用协议3篇
- 2024苏州离婚协议书模板制作与婚姻法律风险防范合同3篇
- 2024年股东权益确认协议
- 2024林业土地承包经营权互换合同
- 2024年度大理石石材技术创新与应用合同3篇
- 三方停车场车位租赁协议范本(2024版)
- 2024房地产买卖合同with装修及附加条款
- 2024月子中心消防通道疏通与维修施工合同3篇
- 2024植筋加固材料研发与市场推广合作合同范本3篇
- 南方的耕作制度
- 2024年成都温江兴蓉西城市运营集团有限公司招聘笔试冲刺题(带答案解析)
- 手术器械生锈的原因分析
- 小学道德与法治课活动设计方案
- 家电以旧换新风险识别与应对措施
- 春节英语介绍SpringFestival(课件)新思维小学英语5A
- 卵巢囊肿蒂扭转的临床分析
- 退休职工安全知识讲座
- 全国儿童预防接种知识讲座
- GMP理念在制药工程项目中的应用
- 【阅读提升】部编版语文五年级下册第四单元阅读要素解析 类文阅读课外阅读过关(含答案)
评论
0/150
提交评论