Unix体系结构:
类Unix操作系统结构分为两个状态:1)用户态, 2)内核态
a)操作系统/内核: 用来控制计算机硬件资源, 提供应用程序运行到环境
我们写的程序, 他要么运行在用户态, 要么运行在内核态。一般来说是在用户态
当程序要执行一些特殊代码时, 程序就有可能切入到内核态, 这种切换是由操作系统控制, 不需要人为介入
换角度理解:用户态:最外圈应用程序的活动空间
b)系统调用:就是一些函数(系统函数), 你只需要调用这些函数
c)shell:bash(borne again shell)重新装配的shell, 他是shell的一种, linux上默认采用的是bash
bash就是一个可执行程序, 是一个命令解释器
d)用户态:内核之间的切换:
用户态权限小, 内核态权限大 , 切换不需要我们介入
malloc(), printf() 是系统干的, 不需要我们介入
疑问:为什么区分用户态, 内核态?
(1)权限分开,权限小的干一些危险的事的时候, 不至于威胁到系统
(2)既然这些接口是操作系统提供, 也是操作系统统一管理, 资源是有限的,不加以管理, 会造成访问冲突,资源耗尽,系统崩溃,系统提供接口, 就是减少资源访问上的冲突。
那么什么时候从用户态切换到内核态呢?
a) 系统调用:比如调用malloc()
b) 异常事件:比如来了一个信号
c) 外部设备中断
signal函数范例:
信号来了 我们可以捕捉 signal(para, param) 第一个参数是信号, 第二个是个函数地址
signal因为兼容性 不建议使用
建议使用sigaction()
可重入函数:在信号处理函数中调用, 它是安全的,这些函数是可重入的, 被称为异步信号安全的。
在信号处理函数中注意:
a) 尽量使用简单的函数做简单的事情
b) 如果必须要在信号处理函数中调用系统函数, 一定要是可重入的。
c)如果必须在信号处理函数中调用那些可能修改errno值得函数 , 要事先备份 errno值, 信号返回前恢复errno值。