第5章进程管理及进程间通讯.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(2)信号(signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数); (3)报文(message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 (4)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。 (5)信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。 (6)套接字(socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。 5.4.1 信号 信号是Unix 系统中最古老的进程间通讯机制之一,它主要用来向进程发送异步的事件信号。键盘中断可能产生信号,而浮点运算溢出或者内存访问错误等也可产生信号。shell 通常利用信号向子进程发送作业控制命令。 在 Linux 中,信号种类的数目和具体的平台有关,因为内核用一个字代表所有的信号,因此字的位数就是信号种类的最多数目。对 32 位的 i386 平台而言,一个字为 32 位,因此信号有 32 种。Linux 内核定义的最常见的信号、C 语言宏名及其用途如表5.5 所示: 进程可以选择对某种信号所采取的特定操作,这些操作包括: (1) 忽略信号。进程可忽略产生的信号,但 SIGKILL 和 SIGSTOP 信号不能被忽略。 (2) 阻塞信号。进程可选择阻塞某些信号。 (3) 由进程处理该信号。进程本身可在系统中注册处理信号的处理程序地址,当发出该信号时,由注册的处理程序处理信号。 值 C 语言宏名 用途 1 SIGHUP 从终端上发出的结束信号 2 SIGINT 来自键盘的中断信号(Ctrl-c) 3 SIGQUIT 来自键盘的退出信号(Ctrl-\) 8 SIGFPE 浮点异常信号(例如浮点运算溢出) 9 SIGKILL 该信号结束接收信号的进程 14 SIGALRM 进程的定时器到期时,发送该信号 15 SIGTERM kill 命令发出的信号 17 SIGCHLD 标识子进程停止或结束的信号 19 SIGSTOP 来自键盘(Ctrl-z)或调试程序的停止执行信号 (4) 由内核进行默认处理。信号由内核的默认处理程序处理。大多数情况下,信号由内核处理。 需要注意的是,Linux 内核中不存在任何机制用来区分不同信号的优先级。也就是说,当同时有多个信号发出时,进程可能会以任意顺序接收到信号并进行处理。另外,如果进程在处理某个信号之前,又有相同的信号发出,则进程只能接收到一个信号。产生上述现象的原因与内核对信号的实现有关,将在下面解释。 系统在 task_struct 结构中利用两个字分别记录当前挂起的信号(signal)以及当前阻塞的信号(blocked)。挂起的信号指尚未进行处理的信号。阻塞的信号指进程当前不处理的信号,如果产生了某个当前被阻塞的信号,则该信号会一直保持挂起,直到该信号不再被阻塞为止。除了 SIGKILL 和 SIGSTOP 信号外,所有的信号均可以被阻塞,信号的阻塞可通过系统调用实现。每个进程的 task_struct 结构中还包含了一个指向 sigaction 结构数组的指针,该结构数组中的信息实际指定了进程处理所有信号的方式。如果某个 sigaction 结构中包含有处理信号的例程地址,则由该处理例程处理该信号;反之,则根据结构中的一个标志或者由内核进行默认处理,或者只是忽略该信号。通过系统调用,进程可以修改 sigaction 结构数组的信息,从而指定进程处理信号的方式。 进程不能向系统中所有的进程发送信号,一般而言,除系统和超级用户外,普通进程只能向具有相同 uid (user ID)和 gid(group ID)的进程,或者处于同一进程组的进程发送信号。产生信号时,内核将进程 task_struct 的 signal 字中的相应位

文档评论(0)

微微 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档