本文主要是介绍信号的捕捉、可重入函数、竞态条件、alarm和pause实现sleep、,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
信号的捕捉
信号的捕捉流程:针对的是自定义处理方式
一个进程如何捕捉到一个信号然后进行处理的过程。
如果信号的处理是用户⾃定义函数,在信号递达时就调⽤这个函数,这称为捕捉信号。由于信号处理函数的代码是在⽤户空间的,处理过程⽐较复杂,举例如下: ⽤户程序注册了SIGQUIT信号的处理函数sighandler。 当前正在执⾏main函数,这时发⽣中断或异常切换到内核态。 在中断处理完毕后要返回⽤户态的main函数之前检查到有信号SIGQUIT递达。 内核决定返回⽤户态后不是恢复main函数的上下⽂继续执⾏,⽽是执⾏sighandler函 数,sighandler和main函数使⽤不同的堆栈空间,它们之间不存在调⽤和被调⽤的关系,是 两个独⽴的控制流程。 sighandler函数返回后⾃动执⾏特殊的系统调⽤sigreturn再次进⼊内核态。 如果没有新的信号要递达,这次再返回用户态就是恢复main函数的上下文继续执行了。
面试题:如何实现用户态到内核态的切换?(搜)
用户态切换到内核态的3种方式
a. 系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
b
这篇关于信号的捕捉、可重入函数、竞态条件、alarm和pause实现sleep、的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!