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

浙江省建设注册管理中心网站首页wordpress 插件推荐

浙江省建设注册管理中心网站首页,wordpress 插件推荐,天网网站建设,博物馆布展设计公司排名✨✨ 欢迎大家来到贝蒂大讲堂✨✨ #x1f388;#x1f388;养成好习惯#xff0c;先赞后看哦~#x1f388;#x1f388; 所属专栏#xff1a;Linux学习 贝蒂的主页#xff1a;Betty’s blog 1. 信号的引入 1.1 信号的概念 在Linux系统中#xff0c;信号#xff08;… ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 养成好习惯先赞后看哦~ 所属专栏Linux学习 贝蒂的主页Betty’s blog 1. 信号的引入 1.1 信号的概念 在Linux系统中信号Signal是一种软件中断机制用于通知进程发生了特定的事件。信号可以由系统内核、其他进程或者进程自身发送。 我们可以通过指令kill -l参考所有信号 信号的本质就是一个define定义的宏其中131号信号是普通信号3464号信号是实时信号普通信号和实时信号各自都有31个。每一个信号与一个数字相对应每个信号也都有特定的含义和默认的处理动作。例如信号SIGINT通常由用户按下ctrl c产生表示中断信号默认情况下会导致进程终止。 其中需要注意的是在Linux中前台进程只能有一个而后台进程可以为多个。一般而言我们的bash进程作为我们的前台进程而一旦我们执行一个可执行程序这个可执行程序就会成为前台进程而bash进程就会转为后台进程。但是我们如果在执行一个可执行程序时在之后加一个此时的可执行程序就会由前台进程转换为后台进程。而前台进程与后台进程本质间区别就是前台进程可以从键盘获取数据后台进程则不能。 比如我们运行一个后台进程就无法通过ctrl c终止进程因为其无法从键盘读取数据。此时就只能通过kill指令直接杀死对应的进程。 1.2 信号的获取 我们可以通过指令man 7 signal查看信号的详细说明 其中 Term、Core 表示终止Ign 标记忽略Cont 表示继续Stop 表示暂停。我们早在进程等待时就知道wait与waitpid的参数status本质就是一个位图结构其低16比特位当中高8位表示进程的退出状态即退出码。进程若是被信号所杀则低7位表示终止信号而第8位比特位是core dump标志。 pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options);其中 core dump 标志就是用来区分 Term 和 Core 的。云服务器的 Core dump 功能默认是关闭的但我们可以通过指令ulimit -a 指令来查看当前系统的所有资源限制。 我们可以通过指令ulimit -c size去设置它的大小如果 size 0 就表示开启 Core dump 功能。 其中Term对应的core dump标志位是 0表示正常终止Core对应的core dump标志位是 1表示异常终止。我们可以在程序中通过位运算status71来获取对应的core dump标志。 打开系统的core dump功能后一旦进程出现异常操作系统会将进程在内存中的运行信息转储到进程的当前目录中形成core.pid文件这一过程被称作核心转储。core.pid文件中详细记录了程序的异常原因可以直接帮我们定位到出错行。 比如如下这段代码 #include iostream #include unistd.h #include sys/types.h #include sys/wait.h using namespace std; int main() {int a 10;int b 0;a / b;return 0; } 既然core dump可以帮助我们定位错误信息那么我们为什么要将其关闭呢那是因为如果每次产生错误信息都形成core.pid文件的话系统可能产生大量文件而迫使操作系统挂掉为了避免这种情况一般而言我们并不建议开启该功能。 1.3 signal函数 当一个信号被发送给一个进程时进程可以采取以下几种方式来处理信号 忽略信号进程可以选择忽略某些信号即不对信号做出任何反应。但并不是所有信号都可以被忽略例如 SIGKILL 和 SIGSTOP 信号不能被忽略。捕获信号进程可以注册一个信号处理函数当接收到特定信号时就会执行这个函数。通过这种方式进程可以在接收到信号时执行自定义的处理逻辑。执行默认动作如果进程没有显式地忽略或捕获信号那么它将执行信号的默认动作。默认动作通常是终止进程、停止进程、继续进程等。 接下来我们介绍一个函数signal其可以设置进程对某个信号的自定义捕捉方法即当进程收到 signum 信号的时候去执行 handler 方法。 函数原型 typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler); 参数 signum是一个整数表示要处理的信号编号。handler是一个函数指针指向一个信号处理函数。这个信号处理函数接受一个整数参数即接收到的信号编号并且没有返回值void。可以是以下几种值 SIG_DFL表示默认的信号处理动作。SIG_IGN表示忽略该信号。自定义的信号处理函数指针用于处理特定信号。 例如下面的代码中将2号信号进行了捕捉当该进程运行起来后若该进程收到了2号信号就会打印出对应的信号编码。 #includestdio.h #includeunistd.h #includesignal.h void handler(int sign) {printf(get a signal %d\n,sign); } int main() {signal(2,handler);while(1){printf(hello world\n);sleep(1);}return 0; }其中前台进程在运行过程中用户随时可能按下CtrlC而产生一个信号也就是说该进程的代码执行到任何地方都可能收到SIGINT信号而终止所以信号相对于进程的控制流程来说是异步的。 2. 信号的产生 在我们操作系统中信号的产生方式有许多总体归纳来说有四种。 2.1 终端按键 其中我们通过键盘快捷键直接向我们的进程发出信号的方式非常常见其中较为我们常用的有 组合键功能CtrlC向进程发出SIGINT信号终止进程。Ctrl\向进程发出SIGQUIT信号终止进程。CtrlZ向进程发送SIGTSTP信号暂停进程的执行。 2.2 系统接口 我们也可以通过操作系统为我们提供的接口对进程发送对应的信号。 其中较为常用的一个接口为kill其具体用法如下 函数原型int kill(pid_t pid, int sig);参数pid对应要发送信号进程的pidsig表示发送的信号种类。返回值如果成功返回值为 0。否则返回值为 -1 例如下面这段代码我们可以对指定进程发送一个SIGKILL信号正常终止该进程。 int main() {int cnt 0;while(1){printf(hello world\n);sleep(1);cnt;if(cnt 5){kill(getpid(),SIGKILL);}}return 0; }接下来我们再来介绍两个接口raise与abort。 int raise(int sig); void abort(void);raise函数用于给当前进程发送sig号信号而abort函数相当于给当前进程发送SIGABRT信号使当前进程异常终止。 abort与exit函数同样是终止进程它们之间有什么区别吗 首先明确abort函数和exit函数的不同作用。abort函数的作用是异常终止进程它本质上是通过向当前进程发送SIGABRT信号来实现这一目的。而exit函数的作用是正常终止进程。 需要注意的是使用exit函数终止进程可能会失败因为在某些复杂的程序运行环境中可能存在一些因素干扰正常的进程终止流程。然而使用abort函数终止进程通常被认为总是成功的这是由于其通过发送特定信号强制终止进程一般情况下进程很难忽略该信号而继续运行。 2.3 软件条件 在我们前面学习管道通信时就知道如果进程将读端关闭而写端进程还一直向管道写入数据那么此时写端进程就会收到SIGPIPE信号进而被操作系统终止。SIGPIPE就是一种典型的因为软件异常而产生的信号。 例如下面代码创建匿名管道进行父子进程之间的通信其中父进程去读取数据子进程去写入数据但是一开始将父进程的读端关闭了那么此时子进程在向管道写入数据时就会收到SIGPIPE信号进而被终止。 #includestdio.h #includeunistd.h #includestring.h #includestdlib.h #includesys/types.h #includesys/wait.h int main() {int fd[2]{0};if(pipe(fd)0){perror(pipe:);return 1;}pid_t id fork();if(id 0 ){//child - writeclose(fd[0]);char*msg hello father, i am child...;while(1){write(fd[1],msg,strlen(msg));sleep(1);}close(fd[1]);exit(0);}// father - readclose(fd[1]);close(fd[0]);int status 0;waitpid(id,status,0);printf(child get a signal %d\n,status0x7f);return 0; }我们能够通过alarm函数设定一个闹钟倒计时完毕向我们的进程发送SLGALRM信号其具体用法如下 函数原型unsigned int alarm(unsigned int seconds);参数seconds表示倒计时的秒数。返回值如果调用alarm函数前进程已经设置了闹钟则返回上一个闹钟时间的剩余时间并且本次闹钟的设置会覆盖上一次闹钟的设置。如果调用alarm函数前进程没有设置闹钟则返回值为0。 例如下面这段代码我们首先对SLGALRM信号进行捕捉并给出我们的自定义方法然后5秒后调用alarm函数。 #includestdio.h #includesignal.h #includestdlib.h #includesys/types.h #includeunistd.h void handler(int sign) {printf(get a signal%d\n,sign);exit(1); } int main() {signal(SIGALRM,handler);alarm(5);while(1){printf(hello wrold!\n);sleep(1);}return 0; }2.4 硬件异常 当程序出现除 0、野指针、越界等错误时程序会崩溃本质是进程在运行中收到操作系统发来的信号而被终止。 这些发送的信号都是由硬件异常产生的。 比如下面这段代码进行了对空指针的解引用那么其到底是如何被操作系统识别的呢 #includestdio.h int main() {int *p NULL;*p 3;//对空指针解引用。return 0; }首先我们知道当我们要访问一个变量时进程控制块task_struct一定要会经过页表的映射将虚拟地址转换成物理地址然后才能进行相应的访问操作。 而页表属于一种软件映射关系在从虚拟地址到物理地址映射过程中有一个硬件单元叫做 MMU内存管理单元它是负责处理 CPU 的内存访问请求的计算机硬件。如今MMU 已集成到 CPU 当中。虽然映射工作原本不是由 CPU 做而是由 MMU做但现在其与 CPU 的紧密结合使得整个内存访问过程更加高效。 当进行虚拟地址到物理地址的映射时先将页表左侧的虚拟地址提供给 MMUMMU会计算出对应的物理地址随后通过这个物理地址进行相应的访问。 由于 MMU 是硬件单元所以它有相应的状态信息。当要访问不属于我们的虚拟地址时MMU 在进行虚拟地址到物理地址的转换时会出现错误并将对应的错误写入到自己的状态信息当中。此时硬件异常硬件上的信息会立马被操作系统识别到进而向对应进程发送 SIGSEGV 信号。
http://www.hkea.cn/news/14480063/

相关文章:

  • 呼和浩特网站制作公司一级a行做爰片免费网站
  • 西安网站建设外包服务计算机软件开发培训
  • 常州外贸网站建设公司职业技术学院网站建设项目
  • 帮别人做网站开票开什么税目做会员体系的网站
  • vs2017手机网站开发淘宝券商城网站制作
  • 成都网站建设公司有哪几家口碑营销的前提及好处有哪些?
  • 咨询网站公司建设计划书什么招聘网最好找工作
  • 网站建设必须注意的事项百度投票人气排行榜入口
  • 公司网站上线的通知有哪些建设网站公司
  • 有专业做淘宝网站的美工吗wordpress电子邮件要用什么
  • 网站怎么做缓存公司网站怎么做推广
  • 用自家宽带做网站服务器贺州网站建设公司
  • 微信上浏览自己做的网站吗外贸网站源码带支付
  • 网页设计 网站开发 网络安全苏州网站建设培训学校
  • 建设银行招聘官方网站学校网站管理
  • 台州网站平面设计站酷网页设计分析
  • 聊城网站制作工作室济阳县做网站公司
  • 网址导航网站建站网站 权限
  • 网站关键词优化排名推荐网站让图片充满屏幕怎么做
  • 外包优化网站查发分类信息网
  • 九江网站设计广州微网站建设价位
  • 网站建设初期推广方式photoshop画简单网站
  • 做国外单的网站叫什么名字淘宝怎么才能发布网站建设
  • 网站标题优化排名企业信用信息公示系统年报怎么填
  • 网站建设与网页制作基础入门教程更换网站空间
  • 网站的建设与规划方案ui做标注的网站
  • 民宿网站建设网站的功能
  • 街道网站建设wordpress模版seo
  • 办网站费用多少钱凤凰自媒体平台注册
  • wordpress做小说网站吗安卓上架app要多少钱