改之前的博客格式,之前的格式无法修改

第八章 异常控制流

异常

异常是控制流中的突变,用来响应处理器状态中的某些变化。

  • 异常处理

    1. 异常号:一些是有处理器的设计者分配(包括被零除、缺页、存储器访问违例、断电及算数溢出)其他由操作系统内核的设计者分配(包括系统调用和来自外部I/O设备的信号)。
    2. 异常号是到异常表中的索引。
    3. 异常与过程调用的区别(P482)
  • 异常分为四类:中断、陷阱、故障和终止。
    1. 只有中断是异步发生的,其余三个是同步发生的
    2. 陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口--系统调用。系统调用运行在内核模式中

    各种异常类型术语根据系统不同会有所不同,但对于每个系统,基本概念是相同的。

进程

进程是计算机科学中最深刻最成功的概念之一。系统中的每个程序都是运行在某个进程的上下文中的。(上下文是由程序正确运行所需的状态组成的)

  • 一个独立的逻辑控制流

    1. 一个逻辑流的执行在时间上与另一个流重叠,称为并发流。
    2. 多个流并发地执行的一般现象称为冰法。
    3. 多任务也叫作时间分片:一个进程和其他进程轮流运行的概念称为多任务。
    4. 并行流是并发流的一个真子集。
  • 私有地址空间
  • 上下文切换
    1. 上下文切换是较高层形式的异常控制流。
    2. 内核使用上下文切换来实现多任务。
    3. 调度:在进程执行的某些时刻,内核可以决定抢占当前进程,并重新开始一个先前被抢占的进程。
    4. 当内核代表用户执行系统调用时,可能会发生上下文切换。一般,即使系统调用没有阻塞,内核也可以决定执行上下文切换,而非将控制返回给调用进程。
    5. 中断也可能引发上下文切换。

进程控制

  • 获取进程ID
  • 创建和终止进程
  • 回收子进程
  • 等待回收子进程
    1. 引入:一个进程可以通过调用waitpid函数来等待它的子进程终止或者停止

      #include<sys/types.h>

      #incldue<sys/wait.h>

      pidt waitpid(pidt pid,int *status,int options);//如果成功,返回子进程的PID,如果为WNOHANG,则为0,其他错误则为-1

    2. 说明:默认地,即当options=0的时候,waitpid挂起调用进程的执行,直到它的等待集合中的一个子进程终止。如果等待集合中的一个进程在刚调用的时候就已经终止了,那么waitpid就立即返回。以上两种情况都会使得waitpid函数返回已经终止的子进程的PID,并且去除该进程。
    3. 判断等待集合的成员

      如果pid>0,那么等待的集合就是一个单独的子进程,它的进程ID等于pid; 如果pid<-1,那么等待集合就是由父进程的所有子进程组成的

    4. 修改默认行为 可以通过将options设置为常量WNOHANG和WUNTRACED的各种组合,修改默认行为: WNOHANG:如果等待集合中的任何子进程都还没有都还没有终止,那么就立即返回0; WUNTRACED:挂起调用进程的执行,直到等待集合中的一个变成已经终止的或者被停止,然后返回导致返回的子进程的PID; WNOHANG|WUNTRACED:立即返回。
    5. 检查已回收子进程的退出状态 非空的status参数会被放上status参数的关于返回的子进程的状态信息(wait.h定义了status参数的几个宏) WIFEXITED:如果子进程通过调用exit函数或者一个返回即return政策终止,就返回真; WEXITSTATUS:返回一个正常终止的子进程的退出状态(在WIFEXITED返回为真的时候才定义这个状态) WIFSINGALED:如果子进程是因为一个未被捕获的信号终止的,那么就返回真; WTERMSIG:返回导致子进程终止的信号的编号。只有在WIFSINGALED为真的时候,才定义这个状态。
    6. 错误条件 如果调用进程没有子进程,那么waitpid函数返回-1,并且设置errno为ECHLD; 如果waitpid函数被一个信号中断,那么它返回-1,并设置errno为EINTR
    7. 应用举例

      #include "csapp.h"
      #define N 2
      int main() {
          int status,i;
           pidt pid;
           for(i =0;i<N;i++)
              if((pid = fork())==0)
                  exit(100+i);
          while((pid = waitpid(-1,&status,0))>0) {
               if(WIFEXITED(status))
                  printf("child %d terminated normally with exit status = %d\n",pid,WEXITSTATUS(status));
              else
                  printf("child %d terminated abnormally\n",pid);
           }
           if(errno != ECHILD) unixerror("waitpid error");
               exit(0);
      }        

(1). 父进程创建N个子进程,然后子进程以一个唯一的退出状态退出;
(2).waitpid函数被阻塞直到某个子进程终止,然后进入while循环测试是否是正常终止的;是正常的话就输出;
(3).当回收了所有的子进程之后,再调用waitpid就返回-1,并且设置errno为ECHILD;如果不是正常终止的,就输出一个错误消息
  • 函数使用

    1. sleep函数将一个进程挂起一段指定的时间

      #include <unistd.h>
      unsigned int sleep(unsigned int secs);
    2. pause函数让调用函数休眠,直到该进程收到一个信号

      #include <unistd.h>
      int pause(void);
    3. execve函数在当前进程的上下文中加载并运行一个新程序

      #include <unistd.h>
      int execve(const char *filename,const char *argv[],const char *envp[]);
    4. getenv、setenv、unsetenv函数(P501)
    5. 关于fork和execve的区别: fork函数在新的子进程中运行相同的程序,新的子进程是父进程的一个复制品; 而execve函数在当前进程的上下文中加载并运行一个新的程序,会覆盖当前进程的地址空间,但并没有创建一个新进程。

信号

Unix信号是一种更高层的软件形式的异常

  • 信号术语

    1. 发送信号

      (1). 用/bin/kill程序发送信号

      unix> /bin/kill -9 15213

      (2).从键盘发送信号

      (3).用kill函数发送信号

      #include "csapp.h"
      int main(){
          pid_t pid;
      
          if ((pid = Fork()) == 0){
              Pause();
              printf("control should never reach here!\n");
              exit(0);
          }
      
          Kill(pid,SIGKILL);
          exit(0);
      }

      (4).用alarm函数发送信号

      #include "csapp.h"
      
      void handler(int sig)
      {
          static int beeps = 0;
          printf("BEEP\n");
          if (++beeps<5)
              Alarm(1);
          else{
              printf("BOOM!\n");
              exit(0);
          }
      }
      
      int main()
      {
          Signal(SIGALRM,handler);
          Alarm(1);
          while(1){
              ;
          }
          exit(0);
      }

    2. 接收信号

      (1)signal函数可以改变和信号signum相关联的行为

    3. 处理信号
    4. 可移植的信号处理问题

      (1)sigaction函数

  • 非本地跳转 将控制直接从一个函数转移到另一个当前正在执行的函数
    1. 通过setjmp和longjmp提供
  • 操作进程的工具
    1. STRACE:打印一个正在运行的程序和它的子进程调用的每个系统调用的轨迹
    2. PS:列出当前系统中的进程(包括僵死进程)
    3. TOP:打印出关于当前进程资源使用的信息
    4. PMAP:显示进程的存储器映射
  • 总结

本章内容较多,且读起来叫枯燥,理解起来较为费力,代码部分更加明显。

时间: 2024-10-10 10:39:21

改之前的博客格式,之前的格式无法修改的相关文章

夺命雷公狗---node.js---22之项目的构建在node+express+mongo的博客项目7之数据的修改

在修改的时候和在PHP里面修改的一样,都是需要在列表页传个id过来才可以实现修改的,如下所示: 然后在后端接收到他传过来id的同时去读取该id的所有信息: 然后就开始写post处理数据方面的问题了,如下所示: <% include header.html %> <div class="wrapper row-offcanvas row-offcanvas-left"> <!-- Left side column. contains the logo and

博客内容和格式整理想法

写文章可以帮助我们思考技术和项目的过程,从整体上总结自己的存在的优点和缺点,避免重复错误.但是博客切忌写成流水账,没有文章的结构和重点,看起来十分乏味,所以我这里总结不同博客类型的内容和博客书写应该注意点,希望在以后提高博客的可读性和逻辑性. 博客类型总结 好的博客需要明确的主题和内容,根据平常工作和学习的需要,通常将博客分成四类:A. 项目记录和总结 B.技术学习和扩展 C.问题解决方案 D.编程技巧.不同的博客类型记录要点不同. 写项目: 项目背景 自己在项目中的职责和完成度 使用技术和技术

hexo+github个人博客搭建

首先要了解一下我们搭建博客要用到的框架.Hexo是高效的静态站点生成框架,它基于Node.js.通过Hexo,你可以直接使用Markdown语法来撰写博客.相信很多小伙伴写工程都写过README.md文件吧,对,就是这个格式的!写完后只需两三条命令即可将生成的网页上传到你的github上,然后别人就可以看到你的网页啦.是不是很简单?你无需关心网页源代码的具体细节,你只需要用心写好你的博客内容就行. 安装Node.js 首先下载最新版Node.js,我这里给的是64位的. 安装选项全部默认,一路点

关于博客模式变化的说明

最近写博客感觉越来越没状态,渐渐有种记流水账的感觉.我把博客发给朋友看了一下,听了朋友的一些看法,越来越确定自己对博客的一些定位需要改变,现在此对需要改变的地方与改变的原因做个具体的说明,我希望我对自己写的博客能做到:没有敷衍. 改变博客内容的展开模式.我之前写博客的目的是结合自己学习python的过程对python做一个从零开始的学习教程,这是以整个博客为单元的一个系列专题.现改为由单个博客文章为单元的,不仅限于python的非系列性质文章.意思是之后的博客没有明显的前后衔接关系,每一个博客都

Django从零搭建个人博客 | 使用allauth插件管理用户登录与注册

原文博客地址:http://www.eosones.com/ django-allauth是最受欢迎的管理用户登录与注册的第三方Django安装包,可以大大简化我们用户注册,登录及账户管理,其核心功能包括用户注册.忘记密码.登录(微信,微博等第三方登录:邮箱验证).登录后密码重置.邮箱发送密码重置链接.退出等. 安装与设置 运行CMD,打开虚拟环境 pip install django-allauth 安装好后设置Myblog / settings.py,将allauth相关APP加入到INST

Google搜索成最大入口,简单谈下个人博客的SEO

个人静态博客SEO该考虑哪些问题呢?本篇文章给你答案 咖啡君在开始写文章时首选了微信公众号作为发布平台,但公众号在PC端的体验并不好,连最基本的文章列表都没有,所以就搭建了运维咖啡吧的网站,可以通过点击文章底部"阅读原文"访问网站体验 为了方便管理及节约成本,选择了免费的Github Pages作为网站运行平台.用Django写了个管理后台来管理文章,管理后台跑在我的电脑上,它可以将markdown格式的内容生成静态页面并自动上传至Github,管理后台的介绍看这篇文章:利用Djang

使用IntelliJ IDEA开发SpringMVC网站(五)博客文章管理

原文:使用IntelliJ IDEA开发SpringMVC网站(五)博客文章管理 摘要 通过对博客文章的管理,实现外键操作. 目录[-] 八.博客文章管理 1.查看文章 2.添加博客? ? ? ? 3.查看博文详情 4.修改博客内容 5.删除博客文章 九.尾声? ? ? ?? 1.如何部署 2.进一步的学习 3.ENDING 转载请注明出处:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: 使用IntelliJ IDEA开发SpringMVC网站(一

用Python编写博客导出工具

用Python编写博客导出工具 罗朝辉 (http://kesalin.github.io/) CC 许可,转载请注明出处 写在前面的话 我在 github 上用 octopress 搭建了个人博客,octopress 使用Markdown语法编写博文.之前我在CSDN博客上也写过不少的技术博文,都说自己的孩子再丑也是个宝,所以就起了把CSDN博客里面的文章导出到个人博客上的念头.刚开始想找个工具把CSDN博客导出为xml或文本,然后再把xml或文本转换为Markdown博文.可惜搜了一下现有博

[V2.0 alpha]又一款博客园Android客户端低调推出

[V2.0]自v1版发布已经有一个月了,赶在周末之前发个v2.0的公测包,欢迎园友下载使用. V2功能说明: 1.用户登陆: 2.文章/新闻评论: 2.用户关注/粉丝查看: 3.个人博客查看: 本来计划还有关注等功能,考虑到这版拖得有点久了,暂时把把其他功能往后延,希望在国庆前能先把登录相关处理好. 下载地址:http://files.cnblogs.com/avenwu/cnblogs-v2.0.0-alpha.apk 扫码: 下面放几张预览图: 在这一版中开发中遇到了一些技术点和困难: 1.