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("\tchild pid = %d\n", getpid());
printf("\tchild ppid = %d\n", getppid());
exit(EXIT_SUCCESS);
}
else
{
waitpid( childpid, &status, 0 );
puts( "in parent" );
printf( "\tparent pid = %d\n", getpid() );
printf( "\tparent ppid = %d\n", getppid() );
printf( "\tchild process exited with status %d \n", 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小时
-
改进情况:这周学习内容比较多,和预估的时间差不多。
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)