用vue做的网站怎么实现响应式,做食物外网视频网站,网站开发的项目流程图,手机app网站开发信号的发送的对象是pcb
task_struct{
int signal; //0000 0000 .... 0001
进程pcb中存在int型的signal来保存信号#xff0c;用位图的方式#xff0c;比特位的0#xff0c;1表示是否收到信号
比特位位置表示信号的编号。 发信号的本质就是修改task_struct的信号位图对应的…信号的发送的对象是pcb
task_struct{
int signal; //0000 0000 .... 0001
进程pcb中存在int型的signal来保存信号用位图的方式比特位的01表示是否收到信号
比特位位置表示信号的编号。 发信号的本质就是修改task_struct的信号位图对应的比特位。
信号的作用是为了给用户层传递信息
信号的保存的原因进程收到信号不会立即处理这个信号要有个时间窗口
实时信号立即处理不能丢失
信号的保存 信号递达信号未决信号阻塞 信号递达(delivery):实际执行信号的处理的动作即执行。 信号未决(pedding):信号从产生到递达之间的状态就是把修改对应比特位即信号传到进程。 进程可以选择阻塞Block某个信号被阻塞的信号将处于pending状态,解除阻塞才进入递达状态。 忽略是递达后的状态和block不一样忽略和自定义默认是递达后三种处理方法 用户提供的方法可以覆盖handler数组的自定义方法
信号集类型sigset_t封装好的位图 sigemptyset():初始化并类图所有项都为0 sigaddset(sigset_t*set, int signum) 将位图的第signum位设为1 函数sigprocmask读取或者更改进程的信号屏蔽字。 修改当前进程的block位图 how的选项是 SIG_BLOCK取位图交集 SIG_UNBLOCK最后的set的block是参数set和old set共有的 SIG_SETMASK 覆盖 set是新的位图 oldset是系统的位图 接口实操代码
#includeiostream
#includesignal.h
#includeunistd.husing namespace std;void PrintPending(sigset_t pending)
{for(int signo1;signo31;signo){if(sigismember(pending,signo)){cout1;}else{cout0;}}coutendl;}
void handler(int signo)
{coutcatch a signo: signoendl;
}int main()
{signal(2,handler);//对栈上的位图进行操作sigset_t bset,oset; //封装好的类图sigemptyset(bset); //初始化类图sigaddset(bset,2); //修改本地的类图//对阻塞的位图进行操作sigprocmask(SIG_SETMASK,bset,oset);sigset_t pending;int cnt0;while(true){int nsigpending(pending); //获取pending类图if(n0)continue;PrintPending(pending);sleep(1);cnt;if(cnt20){coutunblock 2 signoendl;sigprocmask(SIG_SETMASK,oset,nullptr);}}// 打印pending// 发送2号信号 000...010return 0;
}
利用mask可以把所有信号进程屏蔽信号不就不会被处理。
信号捕捉处理 当我们的进程从内核态回到用户态进行信号的检测和处理 当系统调用时操作系统会做身份切换的用户身份变成内核身份或者反着来 int 80 从用户态变成内核态 内核态允许访问自己的系统代码和数据。 系统调用就是在1GB的地址空间进行执行的
操作系统视角任何一个时刻都会有进程执行执行操作系统的代码就可以随时执行
操作系统的本质基于时间中断的死循环有一个时钟芯片发送时间中断驱动操作系统进行调度。
ecs寄存器有两个标志比特位 00 表示内核态用户态是11当切换到内核态时才能访问内核代码。int 80陷入80
do_signal检测信号
进入到用户态执行方法如果是系统方法再进行系统态。