Unix程序设计基础第三讲.ppt
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
【Unix程序设计基础第三讲】 本讲主要涵盖了Unix操作系统中的进程管理和信号机制,这些都是Unix程序设计中的核心概念。 回顾上一节课的内容,我们学习了进程的基本概念。进程是操作系统中独立执行的实体,拥有自己的地址空间,包含了指令序列。在Unix中,进程有五个基本状态:新建、就绪、运行、睡眠和僵死。进程之间通过进程ID(PID)进行标识,可以有父子进程的关系。在Unix环境下,我们可以使用`fork()`创建新进程,`execve()`加载新的程序来替换当前进程的指令,以及`wait`和`waitpid`来回收子进程的退出状态。 接着,我们讨论了信号(Signal)在Unix中的作用。信号是一种操作系统向进程传递信息的方式,类似于软件中断。常见的信号包括SIGTERM(终止信号)和SIGKILL(强制杀死信号)。`signal()`和`sigaction()`函数用于改变信号的动作,其中`sigaction()`提供了更强大的功能,可以解决早期`signal()`函数的一些不可靠问题,如处理过程中的信号重入。`alarm()`函数则可以设置定时器,触发特定信号。 发送信号可以通过`kill()`和`raise()`函数实现。`kill()`函数根据指定的进程ID(pid)发送信号,可以针对单个进程、进程组或者所有进程。`raise()`函数则是向自身发送信号,相当于`kill(getpid(), sig)`。在命令行中,可以使用`kill`命令发送信号,通常发送SIGTERM(默认)或SIGKILL。 信号的屏蔽是另一种控制信号接收的方法,允许进程在一段时间内不接收某些信号。被屏蔽的信号会被暂时保存,但在屏蔽解除后,进程会接收到这些信号。值得注意的是,当信号处理函数被调用时,相同信号会被自动屏蔽,但这种屏蔽不会形成信号队列,因此处理函数返回后,进程可能无法知道在处理期间错过了多少个相同信号。 接下来,我们通过一个实例来探讨`SIGCHLD`信号。`SIGCHLD`在子进程结束或停止时发送给父进程,其默认行为是忽略。在创建多个子进程的场景中,如果父进程在结束前没有回收子进程的退出状态,子进程的进程表项将无法释放,导致僵死进程的产生。通常,我们会设置`SIGCHLD`信号的处理函数为`wait`,期望在子进程结束时立即回收状态。然而,由于信号处理过程中的屏蔽机制,这样的处理可能导致父进程只回收部分子进程,因为无法确定在处理函数执行期间错过了多少个`SIGCHLD`信号。 为了解决这个问题,我们需要使用`sigaction`来更精细地控制信号处理,例如设置SA_RESTART标志,确保`wait`在信号处理后能继续执行,或者使用`sigqueue`来传递额外的信息,使得父进程能够正确处理所有子进程的结束。这样,我们就能够确保在Unix程序设计中正确处理进程和信号,避免资源泄露和僵死进程的问题。
剩余33页未读,继续阅读
- 粉丝: 1
- 资源: 1581
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于C++和C混合模式的操作系统开发项目.zip
- (源码)基于Arduino的全球天气监控系统.zip
- OpenCVForUnity2.6.0.unitypackage
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip