第5章 关于信号、进程、线程的编程20160121.ppt

第5章 关于信号、进程、线程的编程20160121.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章 关于信号、进程、线程的编程20160121

信号处理 当某个信号出现时,将按照下列三种方式中的一种进行操作。 (1) 忽略此信号。 大多数信号都可使用这种方式进行处理,但有两种信号却决不能被忽略。它们是:SIGKILL和SIGSTOP。这两种信号不能被忽略的原因是:它们向超级用户提供一种使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(例如非法存储访问或除以0),则进程的行为是未定义的。 (2) 执行用户希望的动作(捕捉信号) 为了做到这一点要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,可执行用户希望对这种事件进行的处理。如果捕捉到SIGCHLD信号,则表示子进程已经终止,所以此信号的捕捉函数可以调用waitpid以取得该子进程的进程ID以及它的终止状态。 (3) 执行系统默认动作。 对大多数信号的系统默认动作是终止该进程。 每一个信号都有一个缺省动作,它是当进程没有给这个信号指定处理程序时,内核对信号的处理。有5种缺省的动作: 异常终止(abort):在进程的当前目录下,把进程的地址空间内容、寄存器内容保存到一个叫做core的文件中,而后终止进程。 退出(exit):不产生core文件,直接终止进程。 忽略(ignore):忽略该信号。 停止(stop):挂起该进程。 继续(continue):如果进程被挂起,则恢复进程的运行。否则,忽略信号。 1、管道通信 什么是管道? 管道是单向的、先进先出的,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的首端读出数据。 管道通信 数据被一个进程读出后,将从管道中删除,其它读进程将不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。 管道主要用于不同进程间通信。 管道创建 管道包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信。 无名管道由pipe()函数创建: int pipe(int filedis[2]); 当一个管道建立时,它会创建两个文件描述符:filedis[0]用于读管道, filedis[1]用于写管道。 返回值:成功返回零,否则返回-1 注意:fd[0] 用于读取管道,fd[1] 用于写入管道。 管道读写 管道主要用于不同进程间通信。实际上,通常先创建一个管道,再通过fork函数创建一个子进程。 注意事项 总结 共享内存 共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。 共享内存实现分为两个步骤: 一、创建共享内存,使用shmget函数。 二、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。 系统调用:shmget( ) ; 原型:int shmget ( key_t key, int size, int shmflg ); 返回值:如果成功,返回共享内存段标识符。 如果失败,则返回- 1: errno = EINVAL (无效的内存段大小) EEXIST (内存段已经存在,无法创建) EIDRM (内存段已经被删除) ENOENT (内存段不存在) EACCES (权限不够) ENOMEM (没有足够的内存来创建内存段) 系统调用:shmat(); 原型:int shmat ( int shmid, char *shmaddr, int shmflg); 返回值:如果成功,则返回共享内存段连接到进程中的地址。 如果失败,则返回- 1: errno = EINVAL (无效的IPC ID 值或者无效的地址) ENOMEM (没有足够的内存) EACCES (存取权限不够) 当一个进程不在需要共享的内存段时,它将会把内存段从其地址空间中脱离。 系统调用:shmdt(); 调用原型:int shmdt ( char *shmaddr ); 返回值:如果失败,则返回- 1: errno = EINVAL (无效的连接地址) 第5章 关于信号、进程、线程的编程 5.4.3 消息队列通信 第5章 关于信号、进程、线程的编程 5.4.3 消息队列通信 第5章 关于信号、进程、线程的编程 5.4.3 消息队列通信 第5章 关于信号、进程、线程的编程 5.4.1 信号通

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档