Linux进程与信号机制.pptVIP

  1. 1、本文档共46页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* 信号机制 信号阻塞与信号未决 int sigpending(sigset_t *set) 功能:检查当前已经产生但被屏蔽(阻塞)的所有信号 参数:set-存储结果的信号集 sigsuspend(const sigset_t *mask) 用于在接收到某个信号之前, 临时用mask替换进程的信号掩码, 并暂停进程执行,直到收到信号为止。sigsuspend 返回后将恢复调用之前的信号掩码。信号处理函数完成后,进程将继续执行。可用于进程同步 * 信号机制 信号接收和处理示例-sigrecv.cpp 信号阻塞和信号集操作示例-sigset.cpp 信号处理小结 一个信号处理器一旦被设置将一直起作用,除非在设置时使用了SA_ONESHOT标志 一个信号处理器执行过程中新到达的同一信号将被屏蔽。另外,可以在参数sa_mask中指定需要屏蔽的其它信号 一个信号被屏蔽时多次产生这个信号,当解除屏蔽时,这个信号只被发送一次 为了避免临界区代码被中断,可以在执行临界区代码时用sigprocmask屏蔽某些信号 Sigsuspend可用于等待某个信号实现进程同步 * 进程终止 系统调用exit终止进程 如果进程是某一控制终端的进程组组长,则向这个进程组的所有进程发送信号SIGHUP 关闭进程打开的所有文件描述符 如果进程有子进程,则将这些子进程的父进程设置为init 向父进程发送信号SIGCHLD * 处理子进程死亡 僵尸进程( zombie.cpp ) 子进程终止时如果父进程存在且未处理SIGCHLD信号则子进程变为僵尸进程 僵尸进程占据系统进程表项 清除僵尸进程的方法1( zombie1.cpp) 忽略SIGCHLD信号(信号处理函数为SIG_IGN) 忽略SIGCHLD信号时,系统将清除子进程的进程表项,这种方法依赖于Linux版本的实现 * 处理子进程死亡 清除僵尸进程的方法2( zombie2.cpp ) 调用函数wait或waitpid等待子进程 pid_t wait(int *status); 等待任意子进程终止,没有子进程终止时阻塞,如果没有子进程返回-1 pid_t waitpid(pid_t pid,int *status,int option); 这种方法没有兼容性问题,但主程序进入等待循环后不能做任何事情 * 处理子进程死亡 pid_t waitpid(pid_t pid,int *status,int option); pid-进程ID pid0,只等待进程id等于pid的子进程退出 pid=-1,等待任何一个子进程退出,同wait option-选项 WNOHANG-无子进程退出时不阻塞 status-存储状态信息 返回值 正常返回时为退出的子进程 id 设置了WNOHANG选项,且无子进程退出时返回0 出错时返回-1,errno为错误代码 * 处理子进程死亡 清除僵尸进程的方法3(zombie3.cpp) 捕获SIGCHLD信号 如果多个SIGCHLD信号同时到达,进程将只收到一个,因此信号处理函数中必须循环调用waitpid处理多个子进程终止 不能使用wait来循环处理多个终止的子进程,因为wait在没有子进程终止时会阻塞,waitpid函数要设置选项WNOHANG防止阻塞。 * 处理子进程死亡 清除僵尸进程的方法4(zombie4.cpp) 调用fork两次,使子进程成为孤儿进程,由init进程管理 这种方法第一次调用fork产生的子进程可能成为僵尸进程 这种方法第二次调用fork产生的子进程由init处理子进程退出,不会成为僵尸进程 * 守护进程 典型守护进程特点: 系统初始化时被init进程启动 生存期为系统执行时间 一直等待事件发生并处理事件 可以利用其他进程完成事件处理 不和任何终端发生联系 * 守护进程 启动守护进程的方法 系统启动时,进程init根据系统启动文件启动守护进程,以超级进程权限运行 Internet 超级服务器inetd可以启动很多守护进程 定时任务进程cron可以周期性的启动一些进程 在终端上由用户启动守护进程 * 守护进程 将用户进程转换为守护进程的步骤 调用fork,然后父进程退出,子进程①继续运行。 调用setsid创建新的session, ①成为头进程。 忽略信号SIGHUP,再次调用fork,然后父进程① (session的头进程)退出 。 调用函数chdir(“/”),使进程不使用任何目录 调用函数unmask(0),使进程对任何写的内容有权限 关闭所有打开的文件描述符 为标准输入(0),标准输出(1),标准错误输出(2)打开新的文件描述符 处理信号SIGCLD,避免守护进程的子进程成为僵尸进程 * 守护进程 inetd守护进

文档评论(0)

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

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

1亿VIP精品文档

相关文档