2017-2018-1 20155313 《信息安全系统设计基础》第六周学习总结
本周学习内容
一、指令学习
fork()
首先我们使用man fork
指令来看一下fork指令的基本内容。fork指令的作用是生成一个子进程。
一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
为了理解fork指令的意思我从网上找了一个例子:
#include <unistd.h>
#include <stdio.h>
int main ()
{
pid_t fpid; //fpid表示fork函数返回的值
int count=0;
fpid=fork();
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {
printf("i am the child process, my process id is %d/n",getpid());
printf("我是爹的儿子/n");//对某些人来说中文看着更直白。
count++;
}
else {
printf("i am the parent process, my process id is %d/n",getpid());
printf("我是孩子他爹/n");
count++;
}
printf("统计结果是: %d/n",count);
return 0;
}
而当我们运行这个程序的时候我们会得到结果:
i am the child process, my process id is 2912
我是爹的儿子
统计结果是: 1
i am the parent process, my process id is 2913
我是孩子他爹
统计结果是: 1
一个fork返回了两个不同的fpid值分别是2912与2913!
在语句fpid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的几乎完全相同,将要执行的下一条语句都是if(fpid<0)……
为什么两个进程的fpid不同呢,这与fork函数的特性有关。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
- 在父进程中,fork返回新创建子进程的进程ID;
- 在子进程中,fork返回0;
- 如果出现错误,fork返回一个负值;
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
exec
首先也使用man exec
来查看exec的相关内容。
exec命令用于调用并执行指令的命令。exec命令通常用在shell脚本程序中,可以调用其他的命令。如果在当前终端中使用命令,则当指定的命令执行完毕后会立即退出终端。
wait
使用man wait
查看wait的内容。
系统中的僵尸进程都要由wait系统调用来回收。
僵尸进程介绍:
系统调用exit后,该进程并非马上消失,而是留下一个叫僵尸进程的数据结构,僵尸进程是非常特使的一种,它放弃了几乎所有的内存空间,没有任何可执行代码,也不能别调度,仅仅在进程列表保留位置,而且不占用任何内存空间。
waitpid
使用man waitpid
查看waitpid的内容。
waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
本周学习问题总结
问题1:wait和waitpid有什么区别?
解决方案1:
- wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或者该进程接收到了一个指定的信号为止。如果该父进程没有子进程或者它的子进程已经结束,则wait()函数就会立即返回。
- waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程(它可以指定需要等待终止的子进程),它还有若干选项,如可提供一个非阻塞版本的 wait()功能,也能支持作业控制。实际上,wait()函数只是 waitpid()函数的一个特例,在Linux 内部实现 wait()函数时直接调用的就是waitpid()函数。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 20篇 | 400小时 | |
第一周 | 100/100 | 1/1 | 5/5 | |
第二周 | 100/200 | 2/3 | 5/10 | |
第三周 | 100/300 | 2/5 | 5/15 | |
第四周 | 100/400 | 1/6 | 5/20 | |
第五周 | 100/500 | 1/7 | 5/25 |