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

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:

  1. wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或者该进程接收到了一个指定的信号为止。如果该父进程没有子进程或者它的子进程已经结束,则wait()函数就会立即返回。
  2. 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

代码托管


参考资料

linux c学习笔记----进程创建(fork,wait,waitpid)

linux wait与waitpid函数的深入分析

posted @ 2017-10-29 21:52  BonsaiYoung  阅读(157)  评论(0编辑  收藏  举报