操作系统——信号
2021-04-23 13:15:33 6 举报
AI智能生成
操作系统——信号
作者其他创作
大纲/内容
信号状态
接受后保存在进程的PCB中,内核首先读取这个,再觉得之后操作
产生方式:软件超时; 硬件异常;终端接受键盘命令;kill;
信号控制
处理方式:忽略; 默认; sigaction返用户态,称 catch;
阻塞
取消阻塞后称递达
阻塞前未决,信号产生未决标志位就会变为1表示信号正在被阻塞,后者依靠前者
未决和阻塞标志可以用相同的数据类型sigset_t,
#include <signal.h>
int sigpending(sigset_t *set);
捕捉信号
int sigaction(int signo, const struct sigaction *act, struct sigaction *oact);
pause处理,挂起至信号抵达,信号处于忽略状态。继续挂起,只如果信号的处理动作是捕捉,则调用了信号处理函数之后pause返回-1,errno设置为EINTR,在程序中作用之所查看是否有其他中断信号
重入操作
大多不可重入的,调用了malloc或free,因为malloc也是用全局链表来管理堆的。
调用了标准I/O库函数。
竞态条件
int sigsuspend(const sigset_t *sigmask);errno
挂起和解除屏蔽同时进行,信号屏蔽字由sigmask参数指定(蔽or不弊),SIGALRM递达后suspend返回,自动恢复原来的屏蔽字,之后要手动还原
原子操作,防止错乱
volatile sig_atomic_t
多流程控制时,编译器优化单一流程没有改变a值,就不需要重复读取(不知道外部还有),因此原子操作时应该加上volatile,防止优化
改变信号屏蔽字
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
阻塞和未决(到达或忽略)标志位
signal
#define SIG_ERR (void (*)())-1
#define SIG_DFL (void (*)())0
#define SIG_IGN (void (*)())1
0 条评论
下一页