zoukankan      html  css  js  c++  java
  • 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函数的深入分析

  • 相关阅读:
    构造函数详解
    左值和左值引用、右值和右值引用
    Lambda函数
    std::thread详解
    运算符重载
    友元函数和友元类
    xadmin list_filter 外键数据不显示
    中缀表达式转后缀表达式
    Centos 7 minimal 联网
    python 运用三目判断对象中多个属性 有且非空
  • 原文地址:https://www.cnblogs.com/bonsai/p/7751510.html
Copyright © 2011-2022 走看看