2017-2018-1 20155222 《信息安全系统设计基础》第6周学习总结
教材学习内容总结
学习目标
了解异常及其种类
理解进程和并发的概念
掌握进程创建和控制的系统调用及函数使用:fork,exec,wait,waitpid,exit,getpid,getppid,sleep,pause,setenv,unsetenv,
理解数组指针、指针数组、函数指针、指针函数的区别
理解信号机制:kill,alarm,signal,sigaction
掌握管道和I/O重定向:pipe, dup, dup2
-
异常的类别:
中断
陷阱和系统调用
故障
终止 -
进程和并发:
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。 -
掌握进程创建和控制的系统调用及函数
- fock()
所需头文件
#include <unistd.h>
函数说明
fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
函数原型pid_t fork( void);
函数返回值
(pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中)
返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1- exec()
所需头文件
#include <unistd.h>
函数说明
执行文件
函数原型 - fock()
int execl(const char *path, const char *arg, ...)
int execv(const char *path, char *const argv[])
int execle(const char *path, const char *arg, ..., char *const envp[])
int execve(const char *path, char *const argv[], char *const envp[])
int execlp(const char *file, const char *arg, ...)
int execvp(const char *file, char *const argv[])
函数返回值
成功:函数不会返回
出错:返回-1,失败原因记录在error中
* wait()
所需头文件
```
#include<sys/types.h>
#include<sys/wait.h>
```
函数说明
等待子进程中断或结束
函数原型
```
pid_t wait(int *status)
```
函数返回值
如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno 中。
* waitpid()
所需头文件
```
#include<sys/types.h>
#include<sys/wait.h>
```
函数说明
waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
函数原型
```
pid_t waitpid(pid_t pid,int *status,int options)
```
函数返回值
如果在调用 waitpid()时子进程已经结束,则 waitpid()会立即返回子进程结束状态值。 子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回。
* exit()
所需头文件
```
stdlib.h
```
函数说明
关闭所有文件,终止正在执行的进程。
函数原型
```
void exit(int status)
```
* getpid()
所需头文件
```
#include <unistd.h>
```
函数说明
取得进程识别码
函数原型
```
pid_t getpid(void);
```
函数返回值
目前进程的进程ID
* getppid()
所需头文件
```
#include <unistd.h>
```
函数说明
取得父进程的进程识别码
函数原型
```
pid_t getppid(void);
```
函数返回值
目前进程的父进程识别码。
教材学习中的问题和解决过程
- 问题1:wait和waitpid有什么区别?
- 问题1解决方案:进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程, wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。 参数status用来保存被收集进程退出时的一些状态,它是 一个指向int类型的指针。但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉 从本质上讲,系统调用waitpit和wait的作用是完全相同 的,但waitpid多出了两个可由用户控制的参数pid和options,从而为我们编程提供了另一种更灵活的方式。
[代码托管]
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 6/6 | 1/1 | 20/20 | |
第二周 | 117/123 | 1/2 | 5/25 | |
第三周 | 83/206 | 2/3 | 5/30 | |
第四周 | 97/303 | 3/4 | 5/35 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)