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

提高网站的用户体验度房地产微网站建设栏目设计

提高网站的用户体验度,房地产微网站建设栏目设计,网站建设合同补充内容,公司邮箱号信号概念 信号是进程之间事件异步通知的一种方式 在Linux命令行中,我们可以通过ctrl c来终止一个前台运行的进程,其实这就是一个发送信号的行为。我们按下ctrl c是在shell进程中,而被终止的进程,是在前台运行的另外一个进程。因…

信号概念

信号是进程之间事件异步通知的一种方式

在Linux命令行中,我们可以通过ctrl + c来终止一个前台运行的进程,其实这就是一个发送信号的行为。我们按下ctrl + c是在shell进程中,而被终止的进程,是在前台运行的另外一个进程。因此信号是一种进程之间的通知方式。

可以通过指令kill -l来查询信号:以上就是Linux中的全部信号,它们分为两个区间:[1, 31] 和[34, 64],也就是说没有0,32,33这三个信号,虽然信号的最大编号为64,但实际上只有62个信号。

  • [1, 31]:这些信号称为非实时信号,当进程收到这些信号后,可以自己选择合适的时候处理
  • [34, 64]:这些信号称为实时信号,当进程收到这些信号后,必须立马处理

由于现在的操作系统基本都是分时操作系统,因此实时信号其实是不符合设计理念的,几乎用不到实时信号,本博客只讲解非实时信号

所有信号都是大写的单词,在C/C++中,一般来说就是大写的,其实信号名就是宏。

那么进程收到信号后要怎么处理呢?

进程有三种处理信号的方式:

  1. 忽略此信号
  2. 执行信号的默认处理函数
  3. 执行信号的自定义处理函数,这种方式也称为信号捕捉

其中TermIgnCoreStopCont就是信号处理的默认行为

  • Term:默认操作是终止进程
  • Ign:默认操作是忽略信号
  • Core:默认操作是终止进程并转储核心
  • Stop:默认操作是暂停进程
  • Cont:默认操作是,如果该进程当前已暂停,则继续该进程

signal函数,包含在头文件<signal.h>中,可以自定义信号的处理方式,函数原型如下:

sighandler_t signal(int signum, sighandler_t handler);

其中这个sighandler_t类型,本质是一个void (*)(int)类型的函数指针,也就是说自定义的信号处理函数必须是void (int)的格式。其中这个处理函数的第一个参数int,就是用来接收信号的编号的。

而返回值也是sighandler_t,其返回原先该信号处理的函数的函数指针。

void handler(int sig)
{cout << "get sig: " << sig << endl;
}int main()
{signal(2, handler);while(true){cout << "hello world!" << endl;sleep(1);}return 0;
}

以上代码中,我们通过signal(2, handler);2号信号的处理方式变成了执行函数handler,此后进程收到号信号时,就会执行cout << "get sig: " << sig << endl;了。

2号信号SIGINT就是ctrl + C发送的信号,因此我们可以直接在shell中通过ctrl + C来发送2号信号,从而验证效果。


信号产生

简单讲解了一下信号的三种处理方式后,再来看看信号是如何产生的,在Linux中,信号主要有两种产生方式:软件条件硬件异常

软件信号

在 Linux 中,“软件条件” 发出的信号指的是由 进程自身或其他进程 产生的信号,而不是由硬件中断或其他外部事件触发的信号。

Linux中有多种系统调用可以发送信号,在此我讲解killraiseabortalarm四种接口,其中abort并不是一个系统调用,而是一个用户操作接口。

kill

kill函数用于给指定pid的进程发送指定信号,需要头文件<sys/types.h><signal.h>,函数原型如下:

int kill(pid_t pid, int sig);

参数:

  • pid:收到该信号的进程的pid
  • sig:发送哪一个信号

返回值:

  • 返回0:发送信号成功
  • 返回-1:发送信号失败
void handler (int sig)
{cout << "get sig: " << sig << endl;exit(1);
}int main()
{pid_t id = fork();if (id == 0) // 子进程{signal(2, handler);while (true){cout << "I am child process" << endl;sleep(1);}}sleep(5);kill(id, 2);return 0;
}

以上示例中,父进程通过fork创建子进程,sleep五秒后通过kill(id, 2);给子进程发送(2) SIGINT信号。子进程通过signal(2, handler);修改了信号处理方式,随后每秒钟输出一次I am child process。

在handler中,会先输出get sig: 2,表示自己收到了信号,然后exit退出进程。

另外的,也可以通过kill指令发送信号,格式为:

kill -sig pid

其中sig为要发送的信号,pid为收到信号的进程pid

其实kill指令底层就是调用kill接口,依然属于系统调用的范围。 


raise

raise函数用于给自己发送信号,需要头文件<signal.h>,函数原型如下:

int raise(int sig);

参数:

  • sig:发送哪一个信号

返回值:

  • 返回0:发送信号成功
  • 返回-1:发送信号失败
void handler(int sig)
{cout << "get sig: " << sig << endl;exit(1);
}int main()
{signal(2, handler);int cnt = 5;while (cnt){cout << "I am a process cnt = " << cnt-- << endl;sleep(1);}raise(2);return 0;
}

先通过signal(2, handler);修改信号的处理函数,随后循环五次,输出"I am a process cnt = ",最后通过raise(2);给自己发送(2) SIGINT信号。


abort

abort函数用于给自己发送(6) SIGABRT信号,需要头文件<stdlib.h>,属于用户操作接口,函数原型如下:

void abort(void);

这个函数功能十分简单,就是给自己发送(6) SIGABRT信号,示例:

int main()
{abort();return 0;
}

输出结果:

Aborted

最后进程输出了Aborted表示自己收到了(6) SIGABRT信号。


alarm

alarm函数用于设定一个闹钟,在一定之间后给当前进程发送信号(14) SIGALRM,需要头文件<unistd.h>,函数原型如下:

unsigned int alarm(unsigned int seconds);

参数:

  • seconds:在seconds秒后发送信号

返回值:

  • 如果之前有还没响的闹钟:取消上一次的闹钟,并返回上一次闹钟的剩余秒数
  • 如果之前没有闹钟了:返回0
void handler(int sig)
{cout << "get sig: " << sig << endl;exit(1);
}int main()
{signal(SIGALRM, handler);alarm(1);int i = 0;while(true){cout << i++ << endl;}return 0;
}

以上代码中,先通过signal(SIGALRM, handler);自定义信号(14) SIGALRM的处理方式。然后通过alarm(1);设定一秒钟的闹钟,在一秒内,程序会不断执行while循环让i++,我们可以看看一秒内计算机可以执行多少次i++

输出结果:

74560
get sig:14

可以看到,计算到74560时,就收到了SIGALRM,终止进程了。 


硬件信号

硬件信号指的是由 硬件事件 触发的信号,而不是由软件代码逻辑控制的。

具体来说,以下情况属于硬件条件发出的信号:

  • 中断: 硬件设备,例如键盘、鼠标、网络接口等,在发生事件时会向 CPU 发送中断信号,例如键盘按键按下、网络数据包到达等。
  • 异常: CPU 在执行指令过程中,如果遇到错误情况,例如除以零、内存访问错误等,会产生异常信号。
  • 时钟中断: 系统定时器会定期向 CPU 发送时钟中断信号,用于调度进程和执行定时任务。
键盘产生信号

通过键盘发送信号是最简单的信号发送方式,最常用的有ctrl + Cctrl + \

  • ctrl + C:向前台进程发送(2) SIGINT信号,效果为直接终止进程
  • ctrl + \:向前台进程发送(3) SIGQUIT信号,效果为直接终止进程

硬件中断

硬件给进程发送信号的本质,其实是通过硬件中断

硬件中断是指硬件设备向 CPU 发送的信号,通知 CPU 有事件发生需要处理。当一个硬件设备需要向 CPU 汇报事件发生时,它会向 CPU 发送一个中断信号。CPU 接收这个信号后,会暂停当前执行的任务,转而去处理硬件设备的请求。

int main()
{int a = 5 / 0;return 0;
}

这是一个很经典的除零错误,如果我们强行运行这个进程,会报出错误Floating point exception,本质上是收到了信号(8) SIGFPE,其实本质上是发生了硬件中断。 

  • CPUCPU是一个硬件,其要处理计算,而5/0这个计算过程就是在CPU中完成的,当CPU检测到这个计算中0做了除数,于是对自己发起硬件中断
  • 操作系统:操作系统检测到硬件中断后,跳转到中断处理程序中断处理程序Linux内核的一部分),然后检测该硬件中断是什么原因,发现是因为除零错误,于是给进程发送(8) SIGPFE信号
  • 进程:进程收到操作系统发来的(8) SIGPFE信号后,执行相应的处理措施

我们之前的ctrl + C按键发送(2) SIGINT信号,本质也是硬件中断,当我们从键盘输入了数据后,键盘向CPU发出硬件中断,随后CPU去执行操作系统中的硬件中断程序,发现是用户按下了ctrl + C,于是操作系统向进程发送(2) SIGINT信号。

与软件条件信号相比,硬件条件信号具有以下特点:

  • 由硬件触发: 硬件条件信号的产生是由硬件事件触发的,而不是由代码逻辑决定的
  • 不可控性: 硬件条件信号的产生通常无法被进程控制,例如硬件设备的故障、网络连接中断等。
  • 不可预测性: 硬件条件信号的产生通常是不可预测的,因为它们是由硬件事件触发的。

 

 

 

 

 

 

 

 

 

 

 

 

 

http://www.yayakq.cn/news/856225/

相关文章:

  • 广告多的网站网站认证方式有几种
  • js跳转网站怎么做上海市房地产官网
  • 哪个网站有做兼职的it外包 源码
  • 怎么替换网站模板房产信息网上自助查询
  • 选择手机网站建设中国站长站
  • 网络营销特点谷歌优化培训
  • 网站单页面可以做302跳转吗id自动导入wordpress
  • 做网站好平台化安卓手机网站开发工具
  • 网站的备案号抖音代运营公司经营范围
  • 新余网站设计萍乡专业的企业网站建设公司
  • 达州网站建设yufanse软件程序流程图
  • 做啥英文网站赚钱深圳网站建设好
  • 网站的转盘游戏怎么做购物网站建设存在的问题
  • 番禺网站开发平台阿里云WordPress主题
  • 高安做网站html旅游网站模板
  • 团购网站为什么做不走wordpress主题子主题运行速度
  • 网站建设实训报告册织梦做网站详细教程
  • 什么是网络社交一点优化
  • 做设计用哪个素材网站好企业网站相关案例
  • 高端it网站建设做网站前必须设计原型吗
  • 广东省建设工程质量安全监督检测总站网站网络营销跟网站推广有啥区别
  • 建设网站的意义作用是什么意思江苏省建设集团有限公司
  • xampp本地搭建网站云南网站设计模板
  • 长春网站建设q479185700棒wordpress设置略缩图外链图片
  • 商业网站建设方案ps软件下载手机版
  • 筹划建设智慧海洋门户网站沈阳自助建站模板
  • 北京网站建设厂家关于外贸公司的网站
  • 网站建设优化重庆做网站的任务书
  • 南通优普网站建设外包合肥网站建设黄页
  • 网站开发与维护是什么网站开发简称