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

网站备案安全承诺书田贝网站建设

网站备案安全承诺书,田贝网站建设,四川确诊感染最新消息,成都 视频网站建设#x1f916;个人主页#xff1a;晚风相伴-CSDN博客 #x1f496;如果觉得内容对你有帮助的话#xff0c;还请给博主一键三连#xff08;点赞#x1f49c;、收藏#x1f9e1;、关注#x1f49a;#xff09;吧 #x1f64f;如果内容有误的话#xff0c;还望指出… 个人主页晚风相伴-CSDN博客 如果觉得内容对你有帮助的话还请给博主一键三连点赞、收藏、关注吧 如果内容有误的话还望指出谢谢 ✨下一篇文章《信号的阻塞》敬请期待 目录 ✨初识信号  从程序员角度看待信号  理解组合键变成信号的原理 常见的信号 理解信号为什么要被进程保存起来 理解信号发送的本质 信号的常见处理方式 ✨信号的产生 Core Dump 初识信号的捕捉 由系统调用产生信号 kill函数  raise函数 abort函数 理解系统调用发送信号 由软件条件产生信号 管道  alarm函数 理解软件条件给进程发送信号 由硬件条件产生信号  ✨总结 在我们的生活中充满了大量的信号我们一看到这些信号就能反应出后续的一系列动作比如红绿灯、交警的手势、你打游戏时给队友发送的信号等等。 举一个详细点的例子在双11的时候你在网上购买了许多的商品并且在等待不同商品快递的到来。但是即使是快递还没到你也能够清楚的判断正在运送的是否是你的快递根据快递的单号这也就是你能“识别快递”。当快递员到了你家楼下你收到了快递到来的通知但是你正在打游戏并且正是关键时刻需要5分钟之后才能拿下去拿快递。那么在这5分钟之内你并没有下楼取快递但是你是知道快递已经到了的也就是拿快递的行为并不是一定要立即执行可以理解为“在合适的时候去拿快递”。从收到快递已到的通知再到你拿快递这期间是有一个时间窗口的在这段时间内你并没有拿到快递但是你知道快递已经到了。本质上是“你知道了有一个快递需要去拿”但是此时你正在忙当时间合适的时候你会去将快递拿回来。当你将快递拿回来之后需要处理这个快递而处理这个快递一般方式有三种1、拆开快递并自己使用执行默认动作  2、拆开快递立马送给别人执行自定义动作  3、快递拿回来后丢在一边继续开一把游戏忽略快递。 这快递到来的整个一过程对你来说是异步的你可以做你自己的事因为你不能确定快递员什么时候把你的快递送到。 ✨初识信号  从程序员角度看待信号  当你在前台启动了一个进程并且这个进程不会自己退出这时你就可以从键盘输入快捷键CtrlC将这个进程终止掉。当你在键盘输入CtrlC时会产生一个硬件中断被操作系统获取并且操作系统会将其解释成2号信号发送给前台进程前台进程收到这个信号进而引起前台进程的退出。 这里的进程就是对应上面例子中的你而操作系统对应的就是快递员信号对应的就是快递。 因此得出结论 Linux信号本质是一种通知机制用户或者操作系统通过发送相应的信号通知进程某些事件已经发生你可以在后续合适的时机对这个信号进行处理。  理解组合键变成信号的原理 键盘的工作方式是通过中断方式进行的当你按下一个组合键时键盘硬件会识别出这是一个特殊的组合并生成相应的中断。Linux内核中的中断处理程序会捕获这个硬件中断并且读取键盘的状态确定是哪个键或者组合键被按下了。之后根据键盘中断的信息中断处理程序就会生成一个或多个信号。 常见的信号 使用kill -l命令可以查看信号列表 ​ 前1-31个信号为普通信号后34-64个信号为实时信号本篇文章只讨论普通信号有兴趣的可以自行去了解一下实时信号。每个信号都有一个编号和一个宏定义名称这些宏定义可以在signal.h中找到。 ​ 理解信号为什么要被进程保存起来 我们知道进程在收到信号时并不是立即对信号进行处理而是在合适的时机进行处理那么信号就需要被我们的进程保存起来所以在进程的PCB中肯定具有保存信号的相关数据结构。 那么用什么数据结构来保存信号最合适呢 这个数据结构要能体现这是一个什么信号、这个信号是否产生等并且我们的信号只有62个说到这想必你已经猜到了对没错用位图来保存信号是为最合适每个信号都可以用一个二进制位来表示其状态。通过使用位图Linux操作系统可以非常快速地检查、设置或清除某个信号的状态而不需要遍历整个信号列表或者执行其它复杂的操作。 理解信号发送的本质 信号发送的本质操作系统修改目标进程的PCB中的指定信号的位图结构将指定信号的二进制位由0 - 1。 信号的常见处理方式 默认进程自带的程序员写好的逻辑忽略不做处理自定义捕捉捕捉信号 ✨信号的产生 Core Dump 如果core dump是被打开的进程在收到某些信号而异常终止时操作系统会将此时进程地址空间中的内容以及有关进程状态的其它信息一同写入一个磁盘文件中生成的这个文件的文件名通常是core这就叫做core dump也叫做核心转储。这个文件通常用于调试可以帮助我们快速的定位到出错的地方。 还记得在上一篇文章进程控制中的一幅图 ​ 用一个比特位来表示core dump是否被打开下面我们就会用代码提取这个比特位进行验证 如果你使用的和我一样是云服务器那么一般核心转储的功能是关闭的需要我们手动打开。 使用ulimit -a查看core dump​ 使用ulimit -c对core dump进行修改 ​ 示例代码 #include iostream #include signal.h #include unistd.h #include sys/types.h #include sys/wait.h using namespace std;int main() {pid_t id fork();if(id 0){sleep(1);int a 100;a / 0;//除0错误exit(1);}int status 0;waitpid(id, status, 0);cout 父进程pid: getpid() 子进程id: id 退出信号: (status 0x7F) \ core dump: ((status 7) 1) endl;return 0; } 结果演示 ​ 利用生成的core dump文件定位问题 ​ 但是并不是所有的信号都会生成core dump文件的 man 7 signal查看手册 ​ 只有Action是core的才会生成core dump文件。 一般在生产环境中都是会关闭core dump的原因如下 浪费磁盘空间core dump文件非常大会占用大量的磁盘空间不安全core dump文件可能包含敏感信息如密码等增加泄漏的风险影响性能生成的core dump会消耗CPU资源影响系统性能。 初识信号的捕捉 ​ 参数 signum对应的信号编号handler回调函数通过回调的方式来修改对应信号的捕捉方法 返回值一般不关心 示例代码如下 #include iostream #include signal.h #include unistd.h using namespace std;void handler(int signum) {cout 捕捉到一个信号: signum endl; }int main() {signal(2, handler);while(true) sleep(1);return 0; } 结果演示 ​ 2号信号已经被我们自定义捕捉了那么我们如何将这个进程终止掉呢 可以使用kill命令将进程终止 ​ 3号信号(SIGQUIT)——进程退出对应的快捷键Ctrl\ 由系统调用产生信号 kill函数  ​ 参数 pid目标进程的pidsig要发送的信号 返回值成功返回0失败返回-1 示例代码  #include iostream #include string #include unistd.h #include stdlib.h #include signal.husing namespace std;void Usage(string proc) {cout Usage:\r\n\t proc signumber processid endl; }int main(int argc, char* argv[]) {if(argc ! 3){Usage(argv[0]);exit(1);}int signumber atoi(argv[1]);int processid atoi(argv[2]);kill(processid, signumber);return 0; }结果演示 ​ raise函数 ​ 自己给自己发送信号 参数 sig要发送的信号 返回值成功返回0失败返回非0 示例代码 #include iostream #include string #include unistd.h #include stdlib.h #include signal.husing namespace std;int main(int argc, char* argv[]) {raise(8);//自己给自己发送信号return 0; }8号信号(SIGFPE)——浮点异常比如除0错误、浮点型错误等  结果演示 ​ abort函数 ​ 用于异常终止一个进程 没有返回值 示例代码 #include iostream #include string #include unistd.h #include stdlib.h #include signal.husing namespace std;int main(int argc, char* argv[]) {cout 我开始执行我的代码了 endl;sleep(1);abort();return 0; }结果演示  ​ 理解系统调用发送信号 用户调用系统接口执行操作系统对应的系统调用代码操作系统提取其参数向目标进程的PCB中的信号位图中修改信号标记位进程会在合适的时候处理信号执行相应的处理动作。 由软件条件产生信号 管道  在管道中如果我们将读端关闭写端一直写写端将缓冲区写满后操作系统会自动终止对应的写端进程终止的本质是操作系统向写端进程发送13号信号(SIGPIPE)。 示例代码  #include iostream #include assert.h #include string #include cstdio #include cstring #include unistd.h #include sys/types.h #include sys/wait.husing namespace std;int main() {// 1.创建管道int pipefd[2] {0}; // pipefd[0]:读端 pipefd[1]: 写端int n pipe(pipefd);assert(n ! -1);(void)n;// 2.创建子进程pid_t id fork();assert(id ! -1);if (id 0){// 子进程close(pipefd[0]);// close(pipefd[0]);char buffer[1024 * 8];while (true){string message 我是子进程我正在给你发消息;int count 0;char send_buffer[1024];snprintf(send_buffer, sizeof(send_buffer), %s[%d] : %d, message.c_str(), getpid(), count);write(pipefd[1], send_buffer, strlen(send_buffer));}exit(0);}// 父进程close(pipefd[0]);int status 0;pid_t ret waitpid(id, status, 0);assert(ret 0);(void)ret;cout signumber: (status 0x7F) endl;close(pipefd[1]);return 0; }结果演示 ​ alarm函数 ​  调用alarm函数可以设定一个闹钟也就是告诉内核在seconds秒之后给当前进程发送14号信号(SIGALARM)该信号默认的处理动作是终止当前进程。 这个函数的返回值是0或者是以前设定闹钟时间剩下的秒数。 打个比方中午吃完饭午睡我设定了一个30分钟的闹钟但是在20分钟之后我被外面的装修声给吵醒了而我又不在想睡了但是闹钟还有10分钟才会响这10分钟就是设定闹钟时间剩下的秒数。 示例代码 #include iostream #include signal.h #include unistd.h #include sys/types.h #include sys/wait.h using namespace std;int main() {alarm(1);int count 0;while(true) {cout count: count endl;}return 0; } 结果演示 ​ 这个程序的作用是1秒钟之内不停地数数,1秒钟到了就被SIGALRM信号终止。 理解软件条件给进程发送信号 操作系统先识别到某种软件条件触发或者不满足之后操作系统就会构建相应的信号并且发送给指定的进程。 由硬件条件产生信号  硬件异常是硬件通过某种检测方式识别到有错误并通知操作系统然后操作系统会向当前进程发送适当的信号。例如当前进程中有除0错误CPU内部的状态寄存器中的溢出标记位就会由0置1操作系统识别到溢出标记位为1立即找到该进程并且向该进程发送8号信号(SIGFPE)进程收到信号会在合适的时候进行处理。再比如当前进程访问了非法地址寄存器中的MMU(内存管理单元)就会产生异常操作系统就会识别到这个异常并且立即找到该进程向该进程发送11号信号(SIGSEGV)进程收到信号会在合适的时候进行处理。 示例代码 野指针异常 #include iostream #include signal.h #include unistd.h using namespace std;void handler(int signum) {sleep(1);cout 捕捉到一个信号: signum endl; }int main() {signal(SIGSEGV, handler);int *p nullptr;*p 100;return 0; } 结果演示 ​  先要明确一个点一旦出现硬件异常进程是不一定会退出的但是一般默认是退出因为进程即使不退出我们也做不了什么。 在我们的结果演示中虽然我们捕捉到了这个信号但是为什么它会死循环呢 因为寄存器中的异常一直没有被解决操作系统就会一直识别到这个异常也就一直会给该进程发送相应的信号。 ✨总结  所有信号的产生最终都要有操作系统来进行执行因为操作系统是进程的管理者信号不是立即被处理的是在合适的时机进程会执行处理信号不是被立即处理的那么就需要被保存起来信号会被保存在进程PCB中的信号位图上 ​
http://www.zqtcl.cn/news/482150/

相关文章:

  • 官方静态网站模板下载小说盗版网站怎么做
  • php网站开发就业wordpress 调整配置文件
  • 来年做那些网站致富全球华设计大赛
  • 福建省城乡建设厅网站网页无法打开怎么办
  • 海口仿站定制模板建站成都网站空间创新互联
  • 网站上传源码织梦企业 网站源码
  • 台州建设网站公司php网站好吗
  • 制作网站需要哪些成本软件开发模型的理解
  • 室内设计网站排行榜前十名有哪些湖南建筑网
  • 荥阳做网站wordpress会员关注
  • 公司网站建设包含的内容wordpress淘宝客知乎
  • 用dw建立网站wordpress文章到期自动下沉
  • 网站右侧 回到顶部传媒公司排名前十
  • 如何制作网站最简单的方法python做的网站多吗
  • 公司网站系统建设策划书游戏代理是什么
  • 网站建设的基本需求有哪些方面怎样免费做网站视频讲解
  • 唐山网站建设托管北京今朝装饰设计有限公司
  • 网站标题关键词长度商务网站建设需要备案吗
  • 微信做淘宝客 网站打不开怎样清除单位域名 网站或互联网网址
  • 晋中工商局网站开发区分局美图秀秀网页版入口
  • 工信部网站实名认证怎么做常州到丹阳
  • 企业品牌网站建设我们的优势招商团队外包
  • 有实力的网站建设公司wordpress做视频站
  • html免费网站模板下载有什么网站学做标书的
  • 哪里做网站seo深圳专业做网站专业
  • 网站建设名词解析自己制作免费网页
  • 网站开发深圳公司企业自助建站的网站
  • 珠海网站建设平台中国软文网官网
  • 绵阳学校网站建设wordpress 采集站
  • 免费设计软件下载网站大全贵州seo技术培训