当前位置: 首页 > news >正文

企业设计网站公司哪家好/小红书网络营销策划方案

企业设计网站公司哪家好,小红书网络营销策划方案,信阳建设网站哪家好,如何在word里做网站一.概念 信号是什么? 信号是进程事件通知机制。提供了异步处理事件的方法。 在linux下输入指令kill -l,可以查看所有信号 二.产生信号的方式 通过终端按键,例如ctrl c,产生的就是2号信号 通过系统调用函数产生信号&#xff0c…

一.概念

信号是什么?
信号是进程事件通知机制。提供了异步处理事件的方法。
在linux下输入指令kill -l,可以查看所有信号

在这里插入图片描述

二.产生信号的方式

  1. 通过终端按键,例如ctrl c,产生的就是2号信号

  2. 通过系统调用函数产生信号,例如kill,raise,abort

 int kill(pid_t pid, int sig); 给对应进程发送对应信号,成功返回0,失败返回-1kill命令就是调用kill函数实现的
 int raise(int sig);给当前进程发送对应信号,成功返回0,失败返回-1
void abort(void);给当前进程发送6号信号,一定会成功,无返回值
  1. 由软件条件产生信号,比如alarm
unsigned int alarm(unsigned int seconds);相当于定一个闹钟,在xx秒后给当前进程发送14号信号
该函数的返回值是以前闹钟还余留下的秒数。
意思是如果在调用alarm之前,进程已经有闹钟了,则该函数返回的是上一个闹钟剩下的时间,如果返回0,则表示上一个闹钟取消,出错返回-1
  1. 硬件异常产生信号,比如除0操作,非法访问,野指针等

三.信号的处理

信号有三种处理方式,但是真正在处理的时候只能选择一种。

处理方式:
1.默认(大部分进程默认都是直接终止进程),比如ctrl+c ,默认终止进程,不过ctrl+c只能终止前台进程,如果在./a.out 后加上&,那么这个进程将会在后台运行,ctrl+c是终止不掉的

2.自定义(捕捉)handler

3.忽略(不理这个信号)

重点讲一下自定义(捕捉)
自定义是用户自己定义的处理方法,当信号递达的时候,执行用户的处理方法。

设置信号处理的函数

#include <signal.h>
sighandler_t signal(int signum, sighandler_t handler);

signum:信号编号

handler:是处理信号的方式,有三种选择。本质是一个函数指针
SIG_DFL:默认
SIG_IGN:忽略
自定义handler方法 typedef void (*sighandler_t)(int) 自定义函数无返回值,参数是信号编号

一个例子,对2号信号做自定义处理
代码:

#include <stdio.h>
#include <signal.h>
void handler(int sig)
{printf("handler success!,sig:%d\n",sig);
}
int main()
{while(1){signal(2,handler);}return 0;
}

结果可以看到,ctrl+c产生的2号信号被捕捉了,那么此时ctrl+c不能终止进程了
在这里插入图片描述

四.发送信号的本质

从产生信号可以看到,不光系统调用可以产生信号,就连键盘输入,硬件中断都会产生信号,那么这些信号都是怎么产生的呢?

原因:在创建一个进程时,会创建PCB,PCB中有一个信号位图,可以是一个unsigned int类型,收到一个信号,OS会找到这个信号的编号,然后在位图上将该信号对应的比特位从0置1。比如说接收了一个2号信号,那么OS就会将PCB中的位图的第二个比特位从0置1,表示收到2号信号。然后再进行相对应的处理

五.信号在内核中的表示

1.block,pending,handler

信号递答:执行信号的处理动作,就是进行处理信号叫做信号递答
信号未决:信号从产生到递答的过程,就是信号收到但还没有处理叫做信号未决
信号阻塞:将一个信号阻塞(屏蔽)掉

注:
阻塞不等于忽略,只要出现信号阻塞就不会递答;忽略是对信号递答的一种处理动作。
信号没有受到阻塞可以未决,信号没有未决也可以阻塞信号,如果一个信号被阻塞了,那么如果发送这个信号就一直未决,永远不会递答,除非取消阻塞

在这里插入图片描述

在PCB中,信号有2个位图,分别是pending位图,表示信号是否未决,block位图,表示信号是否阻塞,和一个handler函数指针数组,表示对信号的处理动作


pending位图:表示信号是否未决。当发送一个信号时,当这个信号没有被阻塞时,就会找到该信号的编号,并在pending位图中将该信号的编号所对应的比特位从0置1,pending位图中,每一个比特位表示信号编号,比特位的内容表示该信号有没有被未决,0表示未被未决,1表示未决;发送信号的本质就是修改pending位图中的比特位内容


block位图:表示信号是否阻塞。每一个比特位表示信号的编号,比特位的内容表示该信号有没有被阻塞,0表示未被阻塞,1表示阻塞。


handler函数指针数组:表示数组的处理方式。都有默认值,如果不自定义(捕捉),就是执行默认方法,如果对某个信号实行了捕捉,那么这个信号就会执行用户自定义方法。handler数组的下标即为信号编号。


pending位图,block位图,handler数组都是一一对应的。

综上所述:当产生一个信号,OS会在PCB中找到block位图,查找该信号所在的比特位是否被阻塞,当没有被阻塞时,会将pending位图中信号所在的比特位从0置1.然后在handler数组里找到信号所对应的下标,再通过函数指针找到对应函数,执行相对应的处理方法,执行完成后,再在pending位图中信号的比特位恢复为0

2.信号集(sigset_t)

每个信号只有一个bit的未决标志,非0即1,阻塞也一样。所以未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集。

3.信号集操作函数

接下来的函数头文件全是#include <signal.h>

操作阻塞信号集和未决信号集

int sigemptyset(sigset_t*set); 将信号集的所有比特位清0
int sigfillset(sigset_t*set); 将信号集的所有比特位置1
int sigaddset(sigset_t*set,int signo); 将signo信号的比特位置1
int sigdelset(sigset_t*set,int signo); 将signo信号的比特位清0
前四个成功返回0,失败返回-1
int sigismember(const sigset_t*set,int signo); 判断signo信号是否在信号集set中
如果signo在信号集内返回1,不在返回0,失败返回-1.

操作阻塞信号集

int sigprocmask(int how, const sigset_t *set, sigset_t *oset);改变或查看阻塞信号集。如果oset是非空指针,则读取进程的当前信号屏蔽字通过oset参数传出。如果set是非空指针,则 更改进程的信
号屏蔽字,参数how指示如何更改。如果oset和set都是非空指针,则先将原来的信号 屏蔽字备份到oset里,然后
根据set和how参数更改信号屏蔽字。how的取值:
SIG_BLOCK:将set中屏蔽字的信号添加到现在的阻塞信号中
SIG_UNBLOCK:从当前信号屏蔽字中解除阻塞的信号
SIG_SETMASK:设置屏蔽字为set所指向的值如果调用sigprocmask解除了对当前若干个未决信号的阻塞,则在sigprocmask返回前,至少将其中一个信号递
达

未决信号集

int sigpending(sigset_t *set);获取当前未决信号集,由set传出
成功返回0,失败返回-1

我们来做一个实验,我们将2号信号阻塞,然后发送2号信号,观察pending位图的变化,然后将2号信号取消阻塞,再捕捉2号信号,会出现什么效果?

代码:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void printpendingmap(sigset_t* p)
{int i =0;for(i = 1;i<=31;i++){if(sigismember(p,i))printf("1");elseprintf("0");}printf("\n");
}
void handler(int sig)
{printf("handler success.sig:\n",sig);
}
int main()
{sigset_t block,oblock;sigemptyset(&block);sigaddset(&block,2);signal(2,handler);sigprocmask(SIG_BLOCK,&block,&oblock);int count = 0;while(1){sigset_t pend;sigpending(&pend);printpendingmap(&pend);count++;sleep(1);if(count==5){sigprocmask(SIG_SETMASK,&oblock,NULL);printf("blockmap is empty!\n");break;}}
}

效果
在这里插入图片描述

六.信号的捕捉

信号在产生时不会立即被处理,而是在合适的时候进行处理,那么什么是合适的时候的呢?

回答:在内核态切换到用户态进行处理

用户态以及内核态

在虚拟地址空间中,一共有4G,前3G是用户的内核地址空间,后1G是内核地址空间,虚拟地址空间通过页表映射到真实的物理内存上,而用户地址空间使用的页表是用户级页表的,每个进程都会保存属于自己的用户级页表,而内核地址空间使用的是内核级页表,所有进程共享内核级页表
在这里插入图片描述
那么如何实现信号捕捉呢?

答:当硬件中断或者有系统调用时,需要从用户态切换到内核态,进行信号的递答,如果信号的处理动作是自定义(捕捉),则需要从内核态再返回到用户态执行用户的自定义函数,执行完成后再通过系统调用再一次返回内核,如果这时候没有信号要递答了,就会从内核态返回到用户态,从上次中断的位置继续执行用户代码。整个动作涉及四次状态的转变。
在这里插入图片描述
上图不好记,通过下图可以可以帮助我们很轻松的记忆。
在这里插入图片描述
信号捕捉函数:
1.signal,上面已经讲过
2.sigaction

#include <signal.h>
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
signum:信号编号
act:根据act进行信号处理动作
oldact:将原本的信号的处理工作传入里面,不关心可设为NULL
act和oldact都指向struct sigaction结构体
成功返回0,失败返回-1.

参考:
sigprocmask函数的使用
信号在内核中的表示
信号的捕捉

http://www.jmfq.cn/news/4939795.html

相关文章:

  • 做淘宝客要建网站吗/免费发帖的网站
  • asp双语企业网站源码/广州seo外包
  • 电商网站图片处理/如何做好推广
  • 做图网站有哪些东西吗/怎么制作一个网站首页
  • 怀化政法网站/专业的google推广公司
  • 肥城做网站tahmwlkj/推广平台排名
  • 做视频网站软件有哪些/百度关键词排名原理
  • 企业网站搭建程序/城关网站seo
  • 教务管理系统学生登录入口/武汉网站seo公司
  • 内江市住房和城乡建设局网站/快速优化排名公司推荐
  • 网站建设制作 武汉/友情链接是什么意思
  • 怎么自己建立一个网站后台/深圳今天重大事件新闻
  • 广州微信网站开发公司/网站关键词排名服务
  • 简述网站设计要遵循哪些原则/太原网站推广排名
  • 网站搬家教程/小程序开发公司哪里强
  • 自己怎么做免费网站空间/合肥网
  • 购物网站要多少钱/好看的网页设计作品
  • 网站建设的风格设置/江北seo页面优化公司
  • 用什么做php网站/设计网站排名
  • 域名和网站绑定/seo综合查询是什么意思
  • 做网站时遇到的问题/优帮云排名优化
  • 广州市网站建设科技/网推团队
  • 专做奢侈品的网站/安卓优化大师老版本
  • tk网站域名注册/百度学术论文查重免费
  • 北京营销网站建设/百度seo排名培训 优化
  • 企业安全文化建设评价准则/官网关键词优化价格
  • 石狮制作网站/网站运营
  • 网站制作推广SSL/微博推广
  • 秦皇岛网站建设/小程序搭建
  • 短网址恢复/百度seo排名曝光行者seo