2016-2017-1 《信息安全系统设计基础》第十一周课程总结

2016-2017-1 《信息安全系统设计基础》第十一周课程总结

本周深入学习Linux系统调用。内容是《深入理解计算机系统》第八章「异常处理」,上周让我们深刻理解了三大抽象「文件、虚存、进程」之一的进程。进程和进程控制,进程间通信,信号处理是学习重点。

学习方法还是要参考别出心裁的Linux系统调用学习法。本周重点是通过实现shell, 生产者/消费者模型,ncurses游戏,I/O重定向等小项目深入理解相关系统调用:fork,exec,wait,pipe,fifo,signal,sigaaction等。

快结课了,大多同学算是知道了怎么学习了,这周分析代码的同学博客都被评优了:
4303 5201 5203 5204 5205 5206 5208 5210 5211 5212 5214 5215 5216 5218 5219 5221 5222 5223 5227 5232 5233 5235 5236 5238 5239 5240
5301 5302 5303 5305 5307 5308 5310 5311 5312 5313 5314 5315 5316 5320 5321 5322 5324
5325 5326 5327 5328 5330 5331 5333 5335 5336

5219宋歌同学说

本周学习了异常控制流和老师上传到QQ群的一些代码,老实说,代码这部分我觉得比上一周工作量大了好多,理解到一半就产生了放弃的念头,不过后来想到,只是运行代码不求甚解的话未免有些舍本逐末,于是及时制止了这种念头,阅读代码使我更深入的理解和分析了代码,理解了数组指针、指针数组、函数指针、指针函数的区别、了解了进程创建和控制的系统调用及函数使用。参考学姐学长们的博客还是给了我很大的帮助的,参考他们对于某些问题的解决方法也在一定程度上也帮助了我减少了困惑和不解,感谢学长学姐们。

在上一届的同学的基础上学习体现了继承和迭代,这是通过博客交作业的一个好处,下一届可以在你们的基础上学的更好。

数组指针、指针数组、函数指针、指针函数的区别是我看一个学生C语言基本功时常问的问题,理解了这四个概念,就能看懂复杂的声明,你理解了吗?

  • char ((x())[])()
  • char ((x[4])())[4]

如果你很清楚上面的x是什么,说明你理解数组指针、指针数组、函数指针、指针函数的概念。

我们这周学习信号处理,要调用signal, sigaction,不知道数组指针、指针数组、函数指针、指针函数,连signal的参数和返回值都看不懂的。

5221高其同学说:

感触最深的还是代码编译,老师之前就强调过拿到代码不要着急去gcc,那样谁都会。而是对于结构简单的代码,在编译执行前好好思考代码应该输出的结果,最后与实际运行结果比对得出相应的结论;对于结构层次复杂的代码,要在输出结果的辅助下,尽可能地去理解代码的功能作用。只有这样,当你编译调试完一个代码后才会有很大的成就感,才会有收获。

下面的代码运行结果是什么?对系统理解不深的根本搞不清楚。

int main(){
    printf("Hello World");
    while(1);
}
int main()
{
	fprintf(stdout, "1234", 5);
	fprintf(stderr, "abcd", 4);
}

没有思考,编译运行后对结果简单看一下,这都不是好的学习方式。上面两个代码的运行结果跟我们的直觉是不一样的。

我感到欣慰的是还是有人提出了对运行结果的不理解,在博客中只有5233韩昊辰思考并解答了这个问题。

还有两个可以精进的地方,下面的代码放在forkgdb.c中:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int  gi=0;
int main()
{
	int li=0;
	static int si=0;
	int i=0;

	pid_t pid = fork();
	if(pid == -1){
		exit(-1);
	}
	else if(pid == 0){
		for(i=0; i<5; i++){
			printf("child li:%d\n", li++);
			sleep(1);
			printf("child gi:%d\n", gi++);
			printf("child si:%d\n", si++);
		}
		exit(0);
		
	}
	else{
		for(i=0; i<5; i++){
			printf("parent li:%d\n", li++);
			printf("parent gi:%d\n", gi++);
			sleep(1);
			printf("parent si:%d\n", si++);
		}
	exit(0);	
	
	}
	return 0;
}

这是练习使用gdb调试多进程的例子,可惜的是大家就跑了一下程序,看了一下结果。

下面的代码是练习调试段错误了,结合core文件gdb可以直接定位哪一行引发段错误.

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char **pp;
    pp[0] = malloc(20);

    return 0;
}

5302张薇同学思考了这个问题,并解决了段错误的问题。

本周博客的主要问题:

  1. 总结内容太多,浪费时间,看书能看懂的就不用写到博客里了。当然还发现了一些抄袭现象,不改会曝光一下。
  2. 代码驱动学习,仅仅编译,运行一下代码是不够的,思考不够是没有收获的,要通过加代码,改代码来增进理解
  3. 代码托管了,就不要贴代码了,浪费时间

本周总结有不少值得思考的,你思考了告诉我,会有惊喜。


欢迎关注“rocedu”微信公众号(手机上长按二维码)

做中教,做中学,实践中共同进步!

rocedu



如果你觉得本文对你有帮助,请点一下左下角的“好文要顶”和“收藏该文


posted @ 2016-11-30 10:43  娄老师  阅读(348)  评论(3编辑  收藏  举报