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

网站如何做3d产品展示百度一下就知道官方网站

网站如何做3d产品展示,百度一下就知道官方网站,免费手机网站申请,微站网1. 信号是什么 信号的概念 Linux中信号(Signal)是进程间通信的一种基本机制,用于通知进程发生了某种事件或异常。信号是异步的,可能由操作系统、其他进程或进程自身触发。 kill -l 指令查看所有的信号 上面的SIGHUP、SIGINT本质就是define宏定义&…

1. 信号是什么

信号的概念

Linux中信号(Signal)是进程间通信的一种基本机制,用于通知进程发生了某种事件或异常。信号是异步的,可能由操作系统、其他进程或进程自身触发。

kill -l  指令查看所有的信号

 上面的SIGHUP、SIGINT本质就是define宏定义,上面的1~31是普通信号,34~64信号是实时信号。

信号的基本作用

1. 通知进程某个事件(终止请求,错误处理等)

2. 允许进程对其他进程或操作系统内核发送简单消息

3. 处理异常(段错误,除0错误等等)

 基本结论

 1. 进程在信号没有产生的时候就知道信号如何处理了。

2. 信号的处理,不是立即处理,而是等到合适的时候再处理

3. 进程早已经内置了对于信号的识别和处理方式。

4. 给进程产生信号的信号源很多

2. 信号的产生

产生信号的方式有很多

为了验证信号的产生我们,需要使用下面的函数

定义:自己设置signum(第一个参数)信号的处理方式

函数声明与头文件

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

参数:

signum:是几号信号即信号的名称。

handler:函数指针,一个返回值类型为void 参数为int的函数

返回值:旧的信号处理函数,(函数指针)

(1). 键盘产生信号
按键功能
ctrl+c向进程发送SIGINT信号,终止进程。
ctrl+\向进程发送SIGQUIT信号,终止进程
ctrl+z向进程发送SIGSTP信号,暂停进程的执行

以ctrl+c为例

ctrl+c就是给目标进程发送信号(中断信号),默认情况下导致进程终止掉。

ctrl+c只能终止前台进程无法终止后台进程。(在Linux中,前台进程只能有一个,后台进程可以为多个)

./test     前台进程

./test &  后台进程

 

我们可以看到ctrl+c没有终止进程,通过指令 kill -9 进程id 才将进程杀掉

在程序执行时也可以切换前后台程序

jobs 指令查看所有后台任务

fg 任务号   :将指定的进程变为前台进程

ctrl+z  :暂停当前进程。然后把进程切换到后台。

bg 任务号 :让进程恢复运行变为后台进程

 我们看看被signal函数修改了处理方法(新处理方法不终止进程)的2号信号能否终止进程

#include<iostream>
#include <sys/types.h>
#include <unistd.h>
#include<signal.h>int cnt=0;
void handlerSig(int sig)
{std::cout<<"信号获取成功 ->"<<sig<<std::endl;}int main()
{signal(SIGINT,handlerSig);for(int i=0;;i++){std::cout<<i<<" hello pc pid: "<<getpid()<<std::endl;//效率低sleep(1);}return 0;
}

 执行结果如下,ctrl+c并不能终止进程了

(2).  系统接口

kill

功能:向指定的进程或进程组发送信号

函数原型及头文件

#include<signal.h>
int kill(pid_t pid,int sig);

参数:

pid:目标进程的id

sig:要发送的信号编号

返回值:

成功返回0,失败返回-1

 raise

功能:向自己发送信号

函数原型

#include<signal.h>
int raise(int  sig);

参数:

sig:发送的信号编号

返回值:
成功返回0,失败返回非0值

 abort

功能:向自己发送6号信号来终止程序执行。不会被signal所影响(会执行signal的自定义函数)进程还是会退出

函数原型与头文件

#include<stdlib.h>void abort(void);

参数:无

 (3). 硬件异常
#include<iostream>
#include <sys/types.h>
#include <unistd.h>
#include<signal.h>void handlerSig(int sig)
{std::cout<<"信号获取成功 ->"<<sig<<std::endl;raise(9);// abort();
}int main()
{for(int i=1;i<=32;i++)signal(i,handlerSig);for(int i=0;;i++){std::cout<<i<<" hello pc pid: "<<getpid()<<std::endl;//效率低// abort();//固定给自己发送信号6号,要求进程必须处理,不会继续执行程序了int a=10;int sum=0;a/=sum;//  /0错误  8号信号// int *p=nullptr;// *p=100;//野指针11号错误sleep(1);}return 0;
}

 除0错误触发8号信号与野指针触发11号信号,下面分别演示

OS为什么会知道硬件异常了呢? 

信号全部都是操作系统发送的。程序犯错了后被OS识别到进程犯错()再发送信号

我们要访问一个变量进程控制块task_struct一定要会经过页表映射将虚拟地址转换为物理地址后访问,在CPU的MMU(内存管理单元)负责处理CPU的内存访问请求的计算机硬件。MMU中有相应的状态信息,访问不属于我们的虚拟地址,虚拟地址转换为物理地址时就会发生错误,将错误写入到自己的状态信息中,然后操作系统就会识别到错误,进而发送信号。

(4). 软件条件

管道通信时如果读端关闭了,写端进程还一直向管道写入数据,那此时写端进程就会收到SIGPIPE信号(13号信号),因为不读了,写就没有意义。操作系统不做没有意义的事情就直接终止了。SIGPIPE就是防止进程在无意义操作中浪费资源与实践。

#include<stdio.h>
#include<iostream>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h>
void handlerSig(int sig)
{std::cout<<"信号获取成功 ->"<<sig<<std::endl;// std::cout<<cnt<<std::endl;raise(9);// abort();
}int main()
{// for(int i=1;i<=32;i++)// signal(i,handlerSig);int fd[2];if(pipe(fd)<0){perror("pipe error");exit(1);}pid_t id=fork();if(id==0)//子进程{close(fd[0]);//关闭读char buffer[4096]="ttttt skl";while(1){write(fd[1],buffer,strlen(buffer));sleep(1);}close(fd[1]);return 0;}else{close(fd[0]);close(fd[1]);int status = 0;waitpid(id,&status,0);//通过进程等待查看信号printf("获得信号:%d\n",status&0x7f);}return 0;
}

 &0x7f获取后七位的值

使用signal的结果如下

13号信号不解释,17号是子进程终止时系统向父进程发送的信号

通过进程等待结果如下 

还能通过alarm函数来设定闹钟,到达设定时间后向我们的进程发送SIGALRM信号(14号信号)

后调用的alarm会被新的调用覆盖掉之前的定时器

函数原型与头文件

#include<unistd.h>
unsigned int alarm(unsigned int seconds);

参数:

seconds:指定秒数后向当前进程发送SIGALRM信号,如果为0返回之前设置alarm的剩余时间。

返回值:函数返回之前定时器剩余秒数,如果之前没有设置定时器则返回0。(即之前alarm设置的秒数剩余多少秒)。

 

#include<iostream>
#include <sys/types.h>
#include <unistd.h>
#include<signal.h>void handlerSig(int sig)
{std::cout<<"信号获取成功 ->"<<sig<<std::endl;raise(9);// abort();
}int main()
{for(int i=1;i<=32;i++)signal(i,handlerSig);alarm(6);for(int i=0;;i++){std::cout<<i<<" hello pc pid: "<<getpid()<<std::endl;//效率低sleep(1);}return 0;
}

执行结果如下所示


这篇就到这里啦,(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤

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

相关文章:

  • 免费博客网站有哪些如何做推广呢
  • 网站分析报告范文2000站长推广工具
  • 在后台怎么做网站内链百度荤seo公司
  • 做足球经理头像的网站seo网站优化师
  • angular 做的网站如何做公司网站推广
  • 有什么网站可以免费建站免费建网站百度应用app下载
  • 网站开发公司运营流程分享推广
  • 扬州建设工程信息网站站长工具查询seo
  • wordpress不用备案长沙网站优化效果
  • 网站管理系统排名文件外链
  • 网站怎么做支付广告联盟点击赚钱平台
  • 网站开发综合设计报告优秀网页设计公司
  • 计算机应用网站建设与维护是做什么长春seo排名
  • 如何查网站pvseo01
  • 如何做网站答题领红包链接搜索引擎优化课程总结
  • 赤峰建设局网站广州网站优化步骤
  • 怎样建网站得花多少钱百度推广售后服务电话
  • 武汉最好的网站建设前十网络营销策划名词解释
  • 从做系统怎么找一起的收藏网站青岛seo培训
  • 帝国cms网站地图生成器谷歌app下载
  • 英国做网站的人北京专业网站优化
  • 网站优化一般要怎么做网络推广的手段
  • 网络调查问卷在哪个网站做网络营销的目的和意义
  • 网站上传文件夹权限定制网站开发
  • 福州手机网站建设竞价推广账户托管费用
  • 网站防御怎么做关键词优化策略有哪些
  • 莱芜网站优化怎么做讯展网站优化推广
  • 网站源码是什么格式semi final
  • 优化教程网下载北京seo关键词优化收费
  • 农业信息网站建设意义互联网创业项目