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

成都h5模板建站网站seo关键词排名

成都h5模板建站,网站seo关键词排名,阿里云服务器租用,专业点的网站制作公司目录 一 前言 二 信号的感性认识 三 信号处理常见方式 四 系统信号列表 五 信号的保存 六 信号的产生 1. 通过终端按键产生信号 2. 通过系统调用向进程发送信号 3. 硬件异常产生信号 4. 软件条件产生信号 一 前言 在Linux操作系统中,进程信号是一个非常重…

目录

一 前言

二 信号的感性认识

三 信号处理常见方式

四 系统信号列表

 五 信号的保存

六 信号的产生

1. 通过终端按键产生信号 

2. 通过系统调用向进程发送信号

 3. 硬件异常产生信号

4. 软件条件产生信号 


一 前言

  在Linux操作系统中,进程信号是一个非常重要的概念。我们在前面的文章中已经见识过了进程信号了,比如我们在进程的一章中,尝试过向进程发送9号信号来终止进程(kill -9 pid)。所以对于用户来说,我们可以通过向进程发送特定的信号使得进程完成某些指定的动作。


二 信号的感性认识

我们在看到红灯的时候就知道需要停下,看到绿灯的时候就知道可以通过,那为什么我们在接收到这种信号之后,就知道做出相应的动作呢?这是因为我们能识别出不同的灯对应的含义,所以我们一旦接收到信号,就知道该怎么做了。

如同生活中的信号,Linux中的信号也是这样的,我们在给进程发送信号的时候,这个信号一定是进程能识别的,且具有一定含义,这样进程才能做出相应的行为。所以

  • 在进程收到信号前,它就有着处理信号的能力
  • 无论有没有接收到信号,进程都需要有识别信号的能力
  • 无论有没有接收到信号,进程都需要有着处理信号的能力,即需要该信号表示的含义或者功能。

三 信号处理常见方式

生活中,我们是如何处理信号的?举个快递的例子,快递员给你打电话说快递到了让你去取,此时一般会有以下几种处理方式:

  1. 立即去取
  2. 由于手头有事,让快递员等一下再去取
  3. 暂时走不开,让快递员将快递放在固定点自己找时间去取

即在快递到的时候,我们大概率是在忙着的,也就是说快递到了这件事和我们当前的状态是异步发生的。

事实上,进程信号也是一样的,我们在给进程发送信号的时候,是异步通知的。进程在收到信号的时候大概率是在忙的,所以进程此时就可以选择对信号处理方式

  1. 执行该信号的默认处理动作。
  2. 忽略此信号。
  3. 接收到信号,自定义处理,即用户接收到信号之后,自定义信号的处理动作

四 系统信号列表

用   kill -l   命令可以察看系统定义的信号列表

 可以看到系统一共存在着64种信号,其中1~31号都是普通的进程信号34~64都是属于实时信号实时信号即是要 立即处理 的信号,而普通信号不需要立即处理。 这些信号在使用的时候,可以直接使用各信号前面的数字,也可以使用信号字母。事实上,这些信号都是宏,这些宏都是定义在  signum.h 的头文件中。


 五 信号的保存

我们知道信号是发给进程的, 而进程要保存信号,那么应该保存在哪里?

我们知道每一个进程的创建,系统都会为它维护一个PCB,里面存储着有关于进程的各种信息,那么是不是有关于进程的信号也应该存储在里面呢,是的。其实,进程信号就是系统通过修改PCB中的数据来打到向进程发送信号的目的。在每个进程的PCB中都描述着一个记录进程信号的 位图 ,当向进程发送信号时,操作系统就会在进程信号位图的指定位置写入1,指定位置的数据变成了1,就说明已经写入了相应的信号,即进程就已经接收到了相应的信号。

发送信号的本质:修改PCB中的信号位图。


六 信号的产生

  • 通过终端按键产生信号 
  • 通过系统调用向进程发送信号
  • 硬件异常产生信号
  • 软件条件产生信号

1. 通过终端按键产生信号 

我们接下来写一个小测试:

 运行结果

✍我们通过 Ctrl +C 使得一个进程退出。 本质上 Ctrl +C是一个组合键----->OS------->OS将

Ctrl +C 解释成2信号相应的进程内核结构位图第二号比特为变为1,但是此时信号并不会立刻处理,我们看到的Ctrl +C 进程就立马退出了,那是我们肉眼所看,实际cpu速度很快,信号并不会立马处理。我们并没有对信号做任何处理,那么2号信号就会进行默认处理。

如何查看信号的默认动作呢? 我们可以通过 man 7  signal 手册进行查看

如何证明  Ctrl +C 就是2号信号呢,我们可以通过系统调用函数 sighal() ,当收到我们指定信号的时候,会调用我们设置的回调函数执行对应的动作。

🍊 系统调用函数 signal()

 

 运行结果

我们要想使得进程退出,可以使用 kill  9 PID

🌾:除了快捷键 ctrl +c 之外。ctrl +\ 也可以使得进程退出 

 

2. 通过系统调用向进程发送信号

㊀: kill

接下来我们写一个测试来进行系统调用向进程发生信号

#include <iostream>
#include <string>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <cstdio>
#include <stdlib.h>
//mysignal.cpp
static void Usage(const std::string & proc)
{std::cout<< " Usage: "<<proc<<"pid sighno"<<std::endl;
}
// ./myprocess pid signo
int main(int argc, char* argv[])
{//2.系统调用向进程发送信号if(argc != 3){Usage(argv[0]);exit(1);}pid_t pid =atoi(argv[1]);int signo =atoi(argv[2]);//将字符串转换成整型int n=kill(pid,signo);if(n !=0){perror("kill");}
}
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
//mytest.cpp
int main()
{while(true){std::cout<<"我是一个正在运行的进程:pid"<<getpid()<<std::endl;sleep(1);}
}
makefile///
.PHONY:all
all: mysignal mytestmytest:mytest.cppg++ -o $@ $^ -std=c++11
mysignal:mysignal.cppg++ -o $@ $^ -std=c++11
.PHONY:clean
clean:rm -f mysignal mytest

测试结果:

🍎:从这个测试中我们可以认识到,向目标进程发信号,不一定要通过键盘热键,还可以通过系统调用接口。上述测试可以认为我们自主实现了kill 命令。 

㊁:raise() 

上述的kill()接口可以给任意进程发生信号,而raise()接口只能给自己发送信号。 

#include <iostream>
#include <string>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <cstdio>
#include <stdlib.h>static void Usage(const std::string & proc)
{std::cout<< " Usage: "<<proc<<"pid sighno"<<std::endl;
}
// ./myprocess pid signo
int main(int argc, char* argv[])
{int cnt=0;while(cnt<=10){printf("cnt: %d\n",cnt++);sleep(1);if(cnt>=5){raise(3);//向自己发送3号信号结束进程。}}}

测试结果: 

 ㊂:abort()

abort()给自己发送指定信号(SIGABRT)。

#include <iostream>
#include <string>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <cstdio>
#include <stdlib.h>
static void Usage(const std::string & proc)
{std::cout<< " Usage: "<<proc<<"pid sighno"<<std::endl;
}
// ./myprocess pid signo
int main(int argc, char* argv[])
{int cnt=0;while(cnt<=10){printf("cnt: %d\n",cnt++);sleep(1);if(cnt>=5){abort();//向自己发送3号信号结束进程。}}
}

🍏: 关于信号处理行为的理解:进程收到大部分的信号,默认处理动作都是终止进程,既然大多数信号处理动作都是终止进程,为什么还有那么多的信号呢?这是因为信号的不同,代表不同的事件,但是对事件发生之后处理的动作可以一样。

 3. 硬件异常产生信号

信号产生不一定非要用户显示发送,操作系统内部也可以发送信号。

int main(int argc, char* argv[])
{std::cout<<"我在运行中..........."<<std::endl;sleep(1);int a=20;a/=0;
}

接下来我们通过 kill -l 来查看对应的信号编号

 再然后我们通过 man 7 signal 手册来查看SIGFPE信号对应的信息,其中Action中有 Core 和

Term ,两者都是终止进程,但是有区别,我们后续再进行说明。

 我们如何证明 Floating point exception 对应的就是8信号呢,接下来我们写个测试,来捕捉除0错误时,系统发来的信号是8信号。

void catchSig(int signo)
{std::cout<< "获取到一个信号,信号编号是: "<<signo<<std::endl;
}int main(int argc, char* argv[])
{//如果没有/0错误,这个函数不会进行调用signal(SIGFPE,catchSig);std::cout<<"我在运行中..........."<<std::endl;sleep(1);int a=20;a/=0;
}

 运行结果:

 🍈:1.OS是如何得知给当前进程发送8号信号的? OS怎么知道我们除0错误了呢?

          2.我们只进行了一次除0,为什么系统一直给我们发送8信号?

1. OS是如何得知给当前进程发送8号信号的? OS怎么知道我们除0错误了呢?

 OS----->cpu运算异常--------->OS必须知道(OS是软硬件资源的管理者)----->OS向进程发送异常信号。

 2.我们只进行了一次除0,为什么系统一直给我们发送8信号?

我们在当前进程进行信号捕捉的时候自定义了信号行为,即进程收到信号并不会退出,既然没有退出,那么进程就还会再被调度。CPU内部只有一份寄存器,CPU再进行运行的时候会进行多个进程切换,也就是说/0这个进程会被调度多次,所以OS就会发送无数次8信号。

4. 软件条件产生信号 

例如管道问题,当管道读端关闭,写端一直写的时候,系统会发送信号终止进程,这个信号是由软件条件(读端关闭,写端一直写)触发的,与硬件无关了,所以叫软件条件产生信号

软件产生的信号通常是指在计算机系统中,操作系统或应用程序通过特定的事件、错误情况或者编程接口(API)调用而触发的一种通知机制。这些信号可以用来通知进程发生了某些特定事件,例如用户请求终止一个进程、硬件异常(如分母为 0 的除法),定时器到期等。

 SIGALRM 是一个软件产生的信号,我们可以在程序内调用 alarm()(alarm闹钟的意思) 接口来设置闹钟。等到“闹钟”响的时候,系统就会向进程发送 SIGALRM 信号(编号14),此信号的默认处理方式为终止进程。

alarm()

 测试:

int main(int argc, char* argv[])
{//4.软件条件alarm(1);//设置了一秒闹钟,当程序运行1秒之后,程序退出。int cnt=0;while (true){std::cout<< "cnt: "<<cnt++<<std::endl;}
}


http://www.dtcms.com/wzjs/53039.html

相关文章:

  • vs动态网站开发seo是付费还是免费推广
  • 海南澄迈住房与建设厅网站百家号seo怎么做
  • 用自己电脑做外网访问网站武汉排名seo公司
  • 手机网站建设要多少钱在线培训平台有哪些
  • 做banner网站独立站seo是什么意思
  • 专业做网站建设 昆山优化营商环境建议
  • 四合一营销型网站网站源码下载
  • 网站建设谈单流程软文推广是什么意思?
  • 做毕业网站的周记成都seo工程师
  • 青岛李沧区城乡建设局网站灰色推广
  • 不会编程 做网站足球队世界排名榜
  • 保险网站模板seo网站排名优化教程
  • 增城做网站大数据精准营销案例
  • p2p网站如何做测试今日热搜头条
  • 现在做网站还有出路吗手机黄页怎么找
  • 做旅游网站设计的感想广州官方新闻
  • 做竞价网站要准备什么条件百度网盘app官网下载
  • 使用vue.js做企业网站百度一下免费下载安装
  • 深圳制作网站的公司哪家好网站排名前十
  • 做网站联盟要多少钱百度seo是什么意思呢
  • 用nodejs做的网站网页设计论文
  • 网站开发文档撰写模板网络营销专业主要学什么
  • 网站开发人员工具seo提高网站排名
  • 打开app登录seo培训课程
  • 免费word模板网站seo网站优化培训找哪些
  • wordpress 引入css样式佛山旺道seo
  • 苏州网站建设名字网站排名软件包年
  • 宜兴做网站的公司有哪些常用的seo网站优化排名
  • 天津做网站找哪家公司好网站优化名词解释
  • 深圳网站建设科技有限公司seo站长