- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Unix程序设计基础 第三讲 Reviews of last class 进程 独立地址空间的指令序列 五种状态基本状态:新建,就绪,运行,睡眠,僵死 状态转换图 进程ID,子进程,父进程 Unix下的多进程编程 fork与execve:进程的创建与程序的运行 wait,waitpid:回收子进程的退出状态 Reviews of last class 信号 是Unix操作系统用来通知进程发生了某种事件的一种手段。也称为软件中断 几个常用的信号 信号编程 signal与sigaction:改变信号动作 alarm:设置闹钟 不可重入函数: 在函数返回之前不可再次被调用,如printf,malloc。 信号编程(续) 功能更强的改变信号动作函数:sigaction。 解决早期signal函数的不可靠问题:在信号处理过程中再次收到这个信号怎么办? 一般情况下用不到,请自己看书。 发送信号函数kill与raise。 函数原型: #include signal.h int kill(pid_t pid, int sig); int raise(int sig); 信号的发送 kill给进程号为pid的进程发送一个sig信号 pid 0:发送给进程ID为pid的进程 pid == 0:发送给与自己同组,并且自己有权限向其发送的进程 pid -1:发送给进程组ID为-pid的进程,并且自己有权限向其发送的进程 pid == -1:所有自己有权限向其发送信号的进程 信号的发送 raise调用给自己发关一个sig信号。 因此,raise(sig);等价于kill(getpid(), sig); 发送信号的shell命令:kill。 在默认情况下发送的是SIGTERM信号 $ kill 12345 等价于 $ kill –TERM 12345,都是向进程12345发送一个SIGTERM信号。 $ kill –KILL 12345,向进程12345发送一个SIGKILL信号 信号的屏蔽 在一段时间内屏蔽掉某些信号,让当前进程接收不到这些信号。 与忽略信号(remember??)不同,被屏蔽的信号会被保存起来(但不排队),在屏蔽解除后会被进程收到。 注意一点:一般情况下用signal函数设置信号动作,在某信号处理过程中,该信号是被屏蔽的。 实例:SIGCHLD信号 不详细讲关于信号屏蔽的系统调用,因为不是很重要,而且内容太多。但我想通过一个例子来让大家了解信号屏蔽: 某个进程通过调用fork创建多个子进程: for (i = 0; i n; i++) { if ((pid = fork()) = 0) break; } 实例:SIGCHLD信号 当父进程给束之前,必须调用wait来回收子进程的退出状态,如: for (i = 0; i n; i++) wait(status); 但这就存在一个问题:只有当父进程结束子进程的状态才能被回收,子进程占用的进程表项才可以被释放。能不能子进程一结束就把它回收? 实例:SIGCHLD信号 回顾上一结,有一个信号叫做SIGCHLD,当子进程停止或结束,父进程将收到一个SIGCHLD信号,默认动作是忽略。 我们自然会想到在SIGCHLD信号的处理函数中调用wait。于是: void sig_chld(int signo) { int status; wait(status); } 实例:SIGCHLD信号 当然我们还要设置SIGCHLD的处理函数: signal(SIGCHLD, sig_chld); 好像已经大功告成,但实际上却存在问题。 (程序演示) 我们看到,系统中留下了很多僵死的进程,说明它们的退出状态并没有被回收,这是为什么? 实例:SIGCHLD信号 解答: 前面说到,在信号处理过程中,相同的信号是被屏蔽的。也就是说,在sig_chld过程中进程是不会再收到SIGCHLD信号的。 被屏蔽的信号被保存下来,在sig_chld返回之后进程会收到被屏蔽的信号。 但是,被屏蔽信号的保存是不排队的,也就是说,进程知道在信号屏蔽过程中有没有收到这个信号,而无法知道收到几个。 实例:SIGCHLD信号 结果:父进程只回收到了某些子进程的退出状态。 解决办法:这样子改写sig_chld函数: void sig_chld(int signo) { int status; while (waitpid(-1, status, WNOHANG) 0) ; } 进程间通信(IPC) 著名Unix与网络专家Richard S
您可能关注的文档
最近下载
- 实验六文本文件的简单应用.doc VIP
- 厨房各作业区点心配菜冷菜间卫生控制.pdf VIP
- 生产安全管理人员考试_金属冶炼(铝及铝合金制造与铸造)_练习题及答案_共350题_第2套_2021_练习模式.pdf VIP
- 风景园林(景观设计)专业中级职称理论考试题库-上(单选题汇总).docx VIP
- 药事管理与法规课程标准.docx VIP
- IEC60664-1 2007 - 标准体系文件资料.pdf VIP
- 10J121《外墙外保温建筑构造》.pdf
- 风景园林(景观设计)专业中级职称理论考试题库-下(多选题汇总).docx VIP
- 危重患者的病情观察ppt课件.pptx VIP
- 《用字母表示数》说课稿-2024-2025学年五年级上册数学人教版[001].docx
文档评论(0)