异常部分代码赏析

8章异常部分代码赏析

本节内容可以通过三个程序综合起来帮助理解。

第一个是帮助理解创建进程和回收进程的shellex.c。

第二个是帮助理解信号阻塞的signal.c

第三个是帮助理解并发导致的竞争的procmask.c

第四个则是帮助理解如何让父进程显式地回收子进程的sigsuspend.c

下面分别讲一下其中的业务逻辑组块,帮助自己更好地理解代码

shellex.c

业务逻辑

实现获取用户输入命令并执行的shell程序

  1. 要获取输入命令,然后执行命令
  2. 要获取输入命令,就需要在标准输入中读取输入用户输入的命令字符串cmdline
  3. 要执行命令,就需要先将空格分隔的字符串cmdline字符串转换成参数列表argv,然后根据参数执行相应的操作。

执行操作API:

  • 判断命令是否为内置命令
    • 是内置命令,则在当前进程执行即可
    • 如果是外部命令,则需要创建子进程并执行外部指令。
  • 判断是否在后台执行命令
    • 如果后台执行命令,则简单返回后台执行命令的PID和命令字符串
    • 如果前台执行命令,则需要父进程挂起当前进程等待子进程结束

代码组块

这部分是通过将代码继续分块,来帮助理解的。

  1. 创建参数字符串

    char *delim;
    buf[strlen(buf) - 1] = '\0';	// fgets会保存最后一个字符为换行符	
    while(*buf && (*buf == ' ')) {buf++;
    }
    while(delim = strchr(buf, ' ')) {argv[argc++] = buf;*delim = '\0';buf = delim + 1;while(*buf && (*buf == ' ')) {buf++;}
    }
    argv[argc] = NULL;
    
  2. 判断是否为内置命令

    if (!builtin_command(argv))
    if (strcmp(argv[0], "quit") == 0)
    
  3. 创建子进程并加载执行新程序

    if ((pid = Fork()) == 0) {if (execve(argv[0], argv, environ) < 0) {printf("%s: Command not found.\n", argv[0]);exit(0);}
    }
    
  4. 前后台执行

    if(!bg) {int status;if (waitpid(pid, &status, 0) < 0) {unix_eror("waitfg: waitpid error");}
    } else {printf("%d %s", pid, cmdline);
    }
    

signal.c

业务逻辑

父进程设置一个SIGCHLD处理程序,然后创建三个输出后立即返回的子进程,随后等待用户输入。用户输入完毕,则进入无限循环,等待处理程序回收子进程。

  • 子进程执行完毕后立刻返回
  • 父进程等待回收子进程

要想避免信号丢失,就需要获取到第一个子进程结束信号的时候,就需要尽可能多地回收子进程。

代码组块

  1. 安全的信号处理

    int olderrno = errno;
    ...
    errno = olderrno;
    
  2. 尽可能回收子进程

    while (waitpid(-1, NULL, 0) > 0) {Sio_puts("Handler heap child\n");
    }
    if (errno != ECHILD) {Sio_error("waitpid error");
    }
    
  3. 设置信号处理程序

    if (signal(SIGCHLD, handler2) == SIG_ERR) {unix_error("signal error");
    }
    
  4. 创建三个子进程

    for (int i = 0; i < 3; i++) {if (Fork() == 0) {printf("Hello from child %d\n", (int)getpid());exit(0);} 
    }
    

procmask2.c

待完成

sigsuspend.c

待完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/855585.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

征程 6 云端 Ota 升级方案设计与实现

01 引言 在开发、调测过程中,经常通过 Ota 技术升级应用软件、底软。目前,项目上已将 Matrix6 的 Demo 部署在实车上,每次软件、底软需要版本更替或版本升级时,都需要研发测试同学上到车上使用工控机进行手动升级。 这流程存在耗费人力多,花费时间长,流程易出错的问题,并…

vxe-table 树表格新增数据,插入指定节点位置操作

vxe-table 新增数据,插入指定节点位置操作 官网:https://vxetable.cn npm install vxe-pc-ui@4.3.37 vxe-table@4.9.31// ... import VxeUI from vxe-pc-ui import vxe-pc-ui/lib/style.css import VxeUITable from vxe-table import vxe-table/lib/style.css // ...createAp…

less5

1.在URL处输入 ?id=1 ?id=1 ?id=1" ?id=1/1发现回显只有you are in......和报错 报错:判断回显是布尔类型 使用order by发现回显有三栏 ?id=1 order by 4%23 ?id=1 order by 1%23 ?id=1 order by 3%23判断数据库长度:8位 ?id=1 and length((select database()))&g…

Java-递归查询部门下所有子部门(包括本部门)

Java-递归查询部门下所有子部门(包括本部门),会得到一个部门id的集合:List deptIds具体代码如下: //递归1public List<Long> queryAllSubInstitutionIds(Long institutionId) {List<Long> subInstitutionIds = new ArrayList<>();querySubInstitutionIds…

生物医学信息

生物信息学基础 生物医学信息学的概念的掌握生物信息学很大一部分工作体现在生物数据的收集、存储、管理与提供 利用多组学数据(基因组,转录组,表观遗传组、蛋白组等)和机器学习、数据挖掘的方法 ,挖掘潜在的生物学、医学的知识和模式,用于解决诊断和治疗。中心法则是什么…

5、导出表

5、导出表 typedef struct _IMAGE_EXPORT_DIRECTORY {DWORD Characteristics;DWORD TimeDateStamp;WORD MajorVersion;WORD MinorVersion;DWORD Name; // 指向 导出表的文件名DWORD Base; // 导出函数的起始序号DWORD NumberOfFunctions; // 所有导…

4、文件与内存转换相关

4、文件与内存转换相关 FileBufferToImageBuffer 也是一样的长话短说。这里涉及了一点,就是内存对齐 PE头与节区之间 节区与节区时间会发生内存对齐。在文件中有一个文件对齐 ​​ 在可选PE头中有这两个进行标识,之前也写过这个内存对齐的博客,这里就不多说了 下面贴几个代…

1、PE 初识

1、PE 初识 概论 首先 PE头部分主要是学习PE结构的前半部分,每一个是做什么的,以及重点是什么,每一个是做什么用的。并使用Cpp代码来解析该PE头 注意这里用了一个Windows.h的头文件,后面再说。 PE是Windows系统 PE结构(Portable Executable),即可移植可执行文件格式,是…

交换空间swap

交换空间: 交换空间是硬盘上的一部分,被用作虚拟内存,当系统的物理内存(RAM)不足时,系统会使用交换空间来存储暂时不用的数据。1.关闭交换空间 1)关闭所有交换空间 swapoff -a2)关闭特定的交换空间 swapoff /dev/sdb12.开启交换空间 1)开启所有交换空间 swapon -a2…

2024 IDEA 2024.3 安装使用教程(附激活至2099年,以及常见问题处理)

IntelliJ IDEA简介 IntelliJ IDEA是一款非常强大的Java集成开发环境(IDE),由JetBrains公司开发。它提供了丰富的功能和工具,帮助开发者更高效地编写、调试和部署代码。 下面这种方式仅供交流学习,如果有能力还请支持正版 下载安装 下载 IDEA 2024.3 版本的安装包 为了方便,也…

第十六次作业

1、通过华为云沃土云创计划免费薅云服务器 打开链接:https://developer.huaweicloud.com/programs/dev-program.html 使能⽅向选择个⼈在这个 计划权益中申请优惠券免费购买成功2、复现windows、linux权限维持技巧 windows权限维持: 隐藏⽂件:利⽤⽂件属性 ⽂件右键属性,勾…

OpenCL 编程步骤 2. 获取设备

clGetDeviceIDs 查询支持OpenCL设备列表: cl_int clGetDeviceIDs(cl_platform_id platform ,cl_device_type device_type ,cl_uint num_entries ,cl_device_id *devices ,cl_uint *num_devices )与clGetPlatformIDs函数类似,第一次调用时,devic…