行业资讯
📅 2026/8/5 10:49:51
信号简介...
#./XXX 前台进程#./YYY 后台进程前台进程能从键盘获取标准输入后台进程不能但二者都可以向标准输出上打印jobs查看所有的后台任务fg任务号将特定的进程提到前台ctrlz将进程切换到后台bg任务号让后台进程恢复运行信号1 kill2 raisetask_struct内部维护了两个位图BitMap和一个函数指针数组1 block表阻塞信号集2 pending表未决信号集3 handler表信号处理函数表调用signal()时底层其实就是在修改这个表BLOCK这里的sigset_t *set代表指向某个信号集变量的指针int代表具体的编号sigemptyset(sigset_t *set)把信号集里所有的位都清零sigfillset(sigset_t *set)把信号集里所有的位置都置为1sigismember(const sigset_t *set, int signo)判断信号是否存在sigdelset(sigset_t *set, int signo)删除特定信号这五个函数仅仅是在程序的内存中修改一个普通的局部变量之后需要调用真正与内核沟通的系统调用比如sigprocmask), 操作系统才会真正去修改block位图how:SIG_BLOCK:追加屏蔽SIG_UNBLOCK解除屏蔽SIG_SETMASK直接覆盖set:…如果把set传为NULL,这通常搭配第三个参数一起使用用来纯查询当前系统屏蔽了哪些信号oldset:保存修改前的旧名单如果不想保存直接传NULLPENDING查询返回当前进程的pending位图修改键盘系统调用系统命令硬件异常软件条件硬件中断OS是怎么知道外设上产生了数据的OS并不会以死循环的方式去不停地询问外设而是通过硬件中断机制而这也正是程序从“用户态”突然“陷入内核态”的常见原因之一1 外设发送的电信号被中断控制器翻译成中断号并发送给CPU2 在打断当前正在执行的任务前CPU会把内部各个寄存器里的数据压入内核栈中保存3 CPU用刚刚获取的中断号查询IDT中断向量表执行中断方法4 之后CPU会把保存在栈里的寄存器数据重新弹回CPU寄存器中继续运行之前中断的任务在众多硬件中断中有一个特殊的存在时钟中断硬件时钟会以一个极其固定的频率向CPU发送一个硬件中断信号所以CPU会被迫定期地不断地停下手头的工作去查询IDT跳转到“时钟中断处理程序”去执行一段代码包括·扣除当前进程的时间片决定是否剥夺CPU控制权·处理所有的软件定时器·更新系统全局时间由此观之硬件时钟和时钟中断堪称操作系统的心脏起搏器是操作系统管理整个计算机的关键软中断硬件中断是外设强加给CPU的而软中断是“正在运行的程序自己主动或被动触发的系统调用System Call)C标准库会在底层执行一条特殊的汇编指令人为地主动地制造一次中断进行用户态与内核态的切换内核中的”下半部“机制在处理比如网络数据等需要大量时间的硬件中断时CPU会先把数据从网卡寄存器拷贝到内存里然后挂起一个软中断标志把CPU释放去响应别的硬件当系统准备返回用户态之前检查软中断标志再去执行滞留的任务异常与陷阱执行非法指令时CPU硬件会发送内部中断信号CPU查IDT跳转到异常处理程序由内核向进程发送信号杀死程序并生成Core Dump文件struct sigaction1 sa_handler函数指针将写好的处理函数名赋值即可2 sa_mask信号集设置在当前信号处理函数执行期间需要额外屏蔽阻塞哪些信号volatile:向编译器发出明确指示这个变量的值可能会被当前代码控制流之外的因素如硬件中断信号处理函数其他线程意外修改。不要对他的读取进行优化即每次使用它时必须强制去物理内存中读取最新值