2017-2018-1 20155223 《信息安全系统设计基础》第14周学习总结

2017-2018-1 20155223 《信息安全系统设计基础》第14周学习总结

教材内容学习总结

进程控制

获取进程

每个进程都有唯一一个正数进程ID。函数getpid返回目标进程的ID,函数getppid返回目标进程的父进程ID。

创建进程和终止进程

从程序员角度,进程被认为总是处在以下三种状态之一:

  • 运行 进程要么正在CPU上执行,要么是在等待被执行借最终会被内核调度。
  • 停止 进程的执行被挂起,且不会被调度。当进程收到SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU信号时,进程就停止,并保持停止直到收到SIGCONT信号,在这个时刻,进程再次开始运行。
  • 终止 进程永远地停止了。进程因为三种原因终止:收到一个信号,该信号的默认行为是永远终止进程;从主程序返回;调用exit函数。

    父进程通过调用fork函数来创建子进程。

    子进程几乎但不完全和父进程相同。新诞生的子进程享有父进程用户级的虚拟地址空间相同的一份副本,包括代码和数据段、对、共享库以及用户栈。子进程还获得与父进程任何打开文件描述符相同的副本,即子进程可以读写父进程中打开的任意文件。子进程与父进程之间最大的区别是它们的ID。

    fork函数只被调用一次,却会返回两次:一次是在父进程中,另一次是在子进程中。在父进程中,fork返回诞生的子进程的PID;在子进程中,fork返回0。因为子进程的PID不为0,所以可以通过返回值来分辨程序是在子进程还是在父进程中运行了。

    一个嵌套fork函数的程序,fork的返回次数为2的被嵌套次数次方个。

回收进程

当一个进程由于某种原因终止是,内核并不是立即把它从系统中清除。相反,进程被保持在一种已终止的状态中,直到它被父进程回收。

如果一个父进程终止了,内核会安排init进程成为它的孤儿进程的养父。init进程的PID为1,是在系统启动时由内核创建的,它不会终止,是所有进程的祖先。如果父进程没有回收它的僵死子进程就终止了,那么内核会安排init进程来回收。

一个进程可以通过函数waitpid来等待其子进程终止或停止。

#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *statusp, int options);

wait函数是waitpid函数的简单版本:

#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *statusp);

调用wait(&status)等价于调用waitpid(-1,&status,0)。

让进程休眠

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

#include <unistd.h>
unsigned int sleep(unsigned int secs);

如果请求时间到了,sleep函数返回0,否则就是返回剩余休眠秒数。

信号

系统信号列表:

用kill函数发送信号

进程通过调用kill函数发送信号给其他进程(包括它们自己)。

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

如果pid大于0,那么kill函数发送信号号码sig给进程pid。如果pid等于0,那么kill发送信号sig给调用进程所在进程组的每个进程,包括调用进程自己。如果pid小于0,kill发送信号sig给进程组|pid|中的每一个进程。

所以函数kill并不能够杀死任意进程,而是只能发送信号。

课后习题

8.25

编写fegts函数的一个版本,叫做tfgets,它5秒钟后会超时。tfgets函数接收和fgets相同的输入。如果用户在5秒内不键入一个输入行,tfgets返回NULL。否则,它返回一个只想输入行的指针。

分析

fgets的定义如下:

char fgets(char buf, int bufsize, FILE stream);

参数:

buf: 字符型指针,指向用来存储所得数据的地址。

bufsize: 整型数据,指明buf指向的字符数组的大小。

*stream: 文件结构体指针,将要读取的文件流。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
#include <setjmp.h>
sigjmp_buf env;
void tfgets_handler(int sig)
{
    signal(SIGALRM, SIG_DFL);
    siglongjmp(env, 1);
}

char *tfgets(char *buf, int bufsize, FILE *stream)
{
    static const int TimeLimitSecs = 5;
    signal(SIGALRM, tfgets_handler)
    alarm(TimeLimitSecs);
    int rc = sigsetjmp(env, 1);
    if(rc == 0) return fgets(buf, bufsize, stream);
    else return NULL; //alarm,time out
}

显然,在tfgets里一开始需要调用fgets。然而,因为五秒时间到了,fgets还没有返回,所以我们必须在处理程序里直接跳转到某个地方进行tfgets的NULL返回。这就需要用到非本地跳转。

代码托管

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 31/31 1/1 20/20
第三周 24/55 2/3 24/44 知道浮点数怎么储存的
第四周 177/328 2/5 17/61 现在我的C语言程序也会在Linux命令行下使用了:*)
第五周 54/382 2/7 18/79 复习一遍汇编语言
第七周 2360/2722 1/8 12/91
第八周 624/3344 2/10 19/110 了解多线程和多进程
第九周 1112/4456 3/13 15/125 学习怎么实现pwd命令
第十一周 157/4613 2/15 10/135 在紧急情况下恢复不可使用的虚拟机
第十三周 999/5471 2/17 17/152 回顾了线程部分的内容
第十四周 181/5652 1/18 10/162

参考资料

时间: 2024-10-07 23:17:29

2017-2018-1 20155223 《信息安全系统设计基础》第14周学习总结的相关文章

20145216 史婧瑶《信息安全系统设计基础》第一周学习总结

20145216 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 Linux基础 1.ls命令 ls或ls .显示是当前目录的内容,这里“.”就是参数,表示当前目录,是缺省的可以省略.我们可以用ls -a .显示当前目录中的所有内容,包括隐藏文件和目录.其中“-a” 就是选项,改变了显示的内容.如图所示: 2.man命令 man命令可以查看帮助文档,如 man man : 若在shell中输入 man+数字+命令/函数 即可以查到相关的命令和函数:若不加数字,那man命令默认从数字较

20145311 《信息安全系统设计基础》第一周学习总结

20145311 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 常用的部分命令 CTRL+SHIFT+T:新建标签页,编程时有重要应用: ALT+数字N:终端中切换到第N个标签页,编程时有重要应用: Tab:终端中命令补全,当输入某个命令的开头的一部分后,按下Tab键就可以得到提示或者帮助完成: CTRL+C:中断程序运行 Ctrl+D:键盘输入结束或退出终端 Ctrl+S: 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+A: 将光标移至输入行头,相当于Home键 Ctrl+E

20145216史婧瑶《信息安全系统设计基础》第九周学习总结

20145216史婧瑶<信息安全系统设计基础>第九周学习总结 教材内容总结 第十章 系统级I/O 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程. 第一节 Unix I/O 这一节涉及到操作系统的基本抽象之一--文件.也就是说,所有的I/O设备都被模型化为文件,而所有的输入输出都被当做对相应文件的读/写.相关的执行动作如下: 1.打开文件: 应用程序向内核发出请求→要求内核打开相应的文件→内核返回文件描述符 文件描述符:一个小的非负整数,用来在后续对此文件的所有操作中标识这个文件.有

20145311 《信息安全系统设计基础》第二周学习总结

20145311 <信息安全系统设计基础>第二周学习总结 教材学习内容总结 重新学习了一下上周的一部分命令:grep main wyx.c(grep的全文检索功能)ls > ls.txt :ls内容输出到文本find pathname -mtime -n/+nfind -size -n/+n (find的功能还是比较强大) 简单地学习了一下vim编辑器,跟着vimtutor简单地学了一些,在linux bash中使用vim能够极大地提高效率, vim的用法比较多,只学习了其中简单的一部分

20145339《信息安全系统设计基础》第一周学习总结

20145339顿珠达杰<信息安全系统设计基础>第一周学习总结 ◆ Linux是一个操作系统.如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 物理机系统上可以通过使用[Ctrl]+[Alt]+[F1]-[F6]进行终端和图形界面切换,在线实验环境中按下[Ctrl]+[Alt]+[F7]来完成切换.普通意义上的 Shell 就是可以接受用户输入命令的程序,Unix/Linux 操作系统下的 Shell 既是用户交互的界面,也是控制系统的

2017-2018-1 20155228 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155228 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 常见的存储技术 RAM 随机访问存储器(Random-Access Memory, RAM)分为两类:静态的和动态的.静态 RAM(SRAM)比动态RAM(DRAM)更快,但也贵得多.SRAM用来作为高速缓存存储 器,既可以在CPU芯片上,也可以在片下.DRAM用来作为主存以及图形系统的帧缓冲 区.典型地,一个桌面系统的SRAM不会超过几兆字节,但是DRAM却有几百或几千兆 字节. SRAM将每

2017-2018-1 20155332 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155332 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 简单模型中,存储器是一个线性的字节数组.真实模型中,是一个具有不同容量,成本,访问时间的存储层次结构(存储器山) 程序的局部性很重要,对程序性能有很重要的影响. 计算机系统一个基本而持久的思想,如果你理解了系统是如何将数据在存储器层级结构中上下移动,你就可以编写程序,让数据存储在层次结构中较高的地方,从而CPU可以更快的访问到他们. 编写程序实现功能是最简单的,如何让编写的程序拥有最高的性能,例

2017-2018-1 20155227 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155227 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 第六章 随机访问存储器 随机访问存储器分为:静态RAM(SRAM)和动态RAM(DRAM),静态RAM(SRAM)比动态RAM(DRAM)更快,但也贵很多. (1)静态RAM SRAM将每个位存储在一个双稳态的存储器单元里,每个单元是用一个六晶体管电路来实现的. 属性:它可以无限制地保持在两个不同的电压配置或状态之一.其他任何状态都是不稳定的. 特点:由于SRAM的双稳态特性,只要有电,它就会永

2017-2018-1 20155334 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155334 <信息安全系统设计基础>第九周学习总结 学习目标: 了解常见的存储技术(RAM.ROM.磁盘.固态硬盘等) 理解局部性原理 理解缓存思想 理解局部性原理和缓存思想在存储层次结构中的应用 高速缓存的原理和应用 教材学习内容总结 一.常见的存储技术: 基本的存储技术包括随机存储器(RAM).非易失性存储器(ROM)和磁盘. 1. RAM分静态RAM(SRAM)和动态RAM(DRAM). 2. SRAM快些,主要用做CPU芯片上的高速缓存,也可以用作芯片下的

2017-2018-1 20155331 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155331 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 存储器层次结构 存储技术 随机访问存储器 随机访问存储器分为:静态的SRAM.动态的DRAM 静态RAM: SRAM的特点:存储器单元具有双稳态特性,只要有电就会永远保持它的值,干扰消除时,电路就会恢复到稳定值. 动态RAM: DRAM的特点:每一位的存储是对一个电容的充电:对干扰非常敏感. 用途:数码照相机和摄像机的传感器 DRAM存储不稳定的应对机制: 存储器系统必须周期性地通过读出,或者重