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

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

课上及课下补充的作业见下面链接

[20155229 《信息安全系统设计基础》第六周作业补充]

http://www.cnblogs.com/fyhtvxq/p/7750262.html

教材学习内容总结

进程创建和控制的系统调用函数

waitpid

  • wait是waitpid函数的简单版本
  • waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
if ( childpid < 0 )
{
    perror( "fork()" );
    exit( EXIT_FAILURE );
}
else if ( childpid == 0 )
{
    puts( "In child process" );
    sleep( 3 );//让子进程睡眠3秒,看看父进程的行为
    printf("	child pid = %d
", getpid());
    printf("	child ppid = %d
", getppid());
    exit(EXIT_SUCCESS);
}
else
{
    waitpid( childpid, &status, 0 );
    puts( "in parent" );
    printf( "	parent pid = %d
", getpid() );
    printf( "	parent ppid = %d
", getppid() );
    printf( "	child process exited with status %d 
", status );
}
exit(EXIT_SUCCESS);
}

如果代码中的“waitpid( childpid, &status, 0 );”行注释掉,程序执行结果如下:

exec1

  • exec1.c代码运行如下

  • fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。
  • 在使用exec函数族时,一定要加上错误判断语句,因为exec很容易执行失败

env

-getenv()读取环境变量的当前值的函数 ,getenv()用来取得参数envvar环境变量的内容

原形:char *getenv(const char *name)

用法:s=getenv("环境变量名");
   需先定义char *s;

功能:返回一给定的环境变量值,环境变量名可大写或小写。如果指定的变量在环境中未定义,则返回一空串。

  • setenv函数是修改或添加环境变量的函数
  • environvar.c代码简单打印环境变量表

信号机制

Singal

  • 头文件#include<signal.h>用法:

sighandler_t signal(int signum, sighandler_t handler);

管道和I/O重定向

pipe

  • pipe用来创建管道并将其两端连接到两个文件描述符,array[0]为读数据端的文件描述符,而array[1]则为写数据端的文件描述符,内部则隐藏在内核中,进程只能看到两个文件描述符

  • 管道它有自身的特点。
    (1)管道通信是单向的,并且遵守先进先出的原则,即先写入的数据先读出。
    (2)管道是一个无结构,无固定大小的字节流。
    (3) 管道把一个进程的标准输出和另一个进程的标准输入连接在一起。数据读出后就意味着从管道中移走了,消失了。其它的进程都不能
    再读到这些数据。就像我们平常见到的管子水流走了就没有了。 这点很重要!!
    (4) pipe这种管道用于两个有亲缘关系的进程之间。

参考(linux进程pipe()函数

  • pipedemo.c创建管道并向自己发送数据

  • pipedemo1.c将pipe和fork结合,创建一对通过管道来通信的进程。在程序中显示了从键盘到进程,从进程到管道,再从管道到进程以及从进程回到终端的数据传输流

  • 关于grep -nr xxx /usr/include 命令的使用

  • grep -nr 查找宏定义,类型定义。这条语句可以用来查找关键字,全文搜索,并且可以直接查找文件内的内容

  • man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用
  • 使用man -k sort | grep 3,可以更好的找到qsort

教材学习中的问题和解决过程

  • 问题一:数组指针、指针数组、函数指针、指针函数的区别

  • 函数指针:重点在指针,表示它是一个指针,它指向的是一个函数。eg: int (*fun)();

  • 指针函数:重点在函数,表示它是一个函数,它的返回值是指针。 eg: int* fun();

  • 数组指针:重点在指针,表示它是一个指针,它指向的是一个数组。int (*fun)[8];

  • 指针数组:重点在数组,表示它是一个数组,它包含的元素是指针 itn* fun[8];

左右法则:右左法则:首先从最里面的未定义的标识符看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明

参考数组指针、指针数组、函数指针、指针函数的区分

指针数组 数组指针 指针函数 函数指针

代码调试中的问题和解决过程

代码托管

(statistics.sh脚本的运行结果截图)
因做缓冲漏洞实验,虚拟机已崩,时间太紧,没来得及安装。用的是vmware上的虚拟机,所以无法进行代码统计。

该问题会在下周解决(包括重新安装虚拟机、把代码补充完整、数据统计等)

上周考试错题总结

3( 多选题 | 1 分)

对于int x; float f; double d;下面正确的是()

A .x == (int)(double)x

B .x==(int)(float)x

C .f == -(-f)

D .1.0/2 == 1/2.0

E .(f+d)-f == d

正确答案: A C D 我的答案: C D

解析:从int转换成float,数字不会溢出,但是可能被舍入;从int或float转换成double,能够保留精确的数值;从float或者double转换成int,值将会向零舍入。

17( 单选题 | 1 分)

int x; x的二进制为[10010101], x>>4的值为()

A .[10010101]

B .[00001001]

C .[11111001]

D .[01010000]

正确答案: C 我的答案: B

解析:有符号的算术右移,左端补k个最高有效位的值。

23( 多选题 | 1 分)

下面和代码可移植性相关的C语言属性有()

A .#define

B .typedef

C .sizeof()

D .union

正确答案: A B C 我的答案: A B 查看知识点

解析:
#define可以定义宏使得变量可移植,typedef可以使得类型可移植,sizeof()使得不同类型长度可移植

35( 多选题 | 1 分)

根据c89国际标准编译程序prog.c,下面正确的是()
A .gcc prog.c

B .gcc -ansi prog.c

C .gcc -std=c89 prog.c

D .gcc -std=gnull prog.c

正确答案: B C 我的答案: A C

解析:在ANSI,ISO C90中,gcc命令行选项为-ansi,-std=c89

结对及互评

点评模板:

  • 博客中值得学习的或问题:

  • 代码中值得学习的或问题:

本周结对学习情况

- [20155225](博客链接)
- 结对照片
- 结对学习内容
    本周我向江智宇同学请教了课上测试3
    共同学习第八、十章内容

其他(感悟、思考等,可选)

  • 本周学习的是第八、十章的内容,还有因为在课堂上没完成课上测试3,所以多了两个内容,在做缓冲漏洞实验时一直显示段错误,内心很崩溃,还有第二天发现虚拟机没法进入桌面形式,尝试了各种方法也不能回到原来的样子。但还是坚持用vmware中的虚拟机完成了这周学习的内容。

  • 得到的教训是,以后实验楼上的实验,我再也不在自己虚拟机上做了,做崩了,还要重更新安装,重新安装很费时间,还很麻烦,以前的代码虽然可以git clone,但是内心是很拒绝这种事情发生的。实验楼上既然有条件,那在那上面做应该是没问题的。

  • 第八章让我很好的对每个函数进行了分析与了解,第十章的内容老师在课堂上上过一些,这让我在这周学习时,也能很好的理解与掌握。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 15篇 400小时
第一周 20/20 1/ 12/12
第二周 42/62 1/2 8/20
第三周 62/124 1/3 14/34
第四周 61/185 1/4 10/44
第五周 / 2/6 13/57
第六周 / 2/8 17/74

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:18小时

  • 实际学习时间:17小时

  • 改进情况:这周学习内容比较多,和预估的时间差不多。

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

原文地址:https://www.cnblogs.com/fyhtvxq/p/7750959.html