《信息安全系统设计基础》第12周学生博客问题总结
明确教材学习目标
第十二周(11.28-12.04)
学习目标
- 第九周代码检查
- 第十周代码检查
- 第十一周代码检查
- 项目
- 汇编堆栈调试
看了78位同学的本周博客后,我发现,本周大家基本上都是以下模式
- 看视频,给出视频知识点
- 继续实践上周代码
- 完成汇编堆栈调试
- 给出前几周链接
因此大家在本周遇到的问题并不多,所以我就逐个点开每个同学给出的前三周链接,结合前两位同学的问题总结:
对此两位同学的总结进行重要问题提取和补缺补漏。
所遇问题及解决办法
问题1:git 上传代码时突然出现如下错误
-
博客链接:20145219宋歌
error: object file .git/objects/2a/xxxxxx is empty
fatal: loose object xxxxxx (stored in .git/objects/2a/xxxxxx) is corrupt
我一直都只是每周添加一个文件夹存储本周内容,格式、之前的内容什么的从来没有改变过,不知道为什么突然不能正常git了。
- 5219宋歌的解决方法:
我把错误粘贴到网上找到了解决方法,如下:
$ rm -fr .git
$ git init
$ git remote add origin your-git-remote-url
$ git fetch
$ git reset --hard origin/master
$ git branch --set-upstream-to=origin/master master
按照上面重新初始化了git仓库,然后git pull下来了之前的内容,之后再进行git add .就没有没问题了。
图1:
分析:git的问题经常会发生,宋歌这种情况也是很常见的。除了这种情况我们还可以参考以下博客来解决git问题:
最终还是需要看肖明的百科式博客:
问题2(第九周的补充):行p598练习题10.1时,我的运行结果是fd=-1
,不是应该出现的正确结果fd=3
-
博客链接: 5219宋歌
图2:
-
5219宋歌的解决方法:
我看着fd=-1的结果,想到之前学习课本open函数时,如果返回值是-1的话说明打开出错,只有打开成功,返回值为新文件描述符(返回的描述符总是在进程中当前没有打开的最小描述符)。后来,我打开代码又一次从第一行开始看,突然发现,我之前只顾着解决代码不能正常编译、运行的问题,却忘了新建两个open函数要打开的文件foo.txt和baz.txt,新建之后就成功了。之后的其他代码也像这个一样就没有问题了。
分析:对第九周问题的补充,问题分析很透彻,解决问题时结合了书上的元知识,也对代码进行分析。
问题3(第十一周的补充):运行cp1.c时出错,提示usage: ./cp1 source destination
-
5219宋歌博客链接:5219宋歌第十一周问题
-
5219宋歌的解决方法:
看到错误提示中的
source destination
,我就知道应该是和文件的源地址有关,但是并不清楚该如何改正,我想到了使用man cp
命令查看标准cp
命令的使用方法,发现cp命令的使用格式应该是cp source dest
,于是我使用相似的格式./cp1 cp1.c(源文件)
cpp.c(目的文件)
运行成功。图3:
分析:第十一周问题总结中没有出现这一问题,我认为这问题的解决思路特别好,所以将它再列入进来。宋歌遇到错误语句并不慌,分析里面的英语,有了解决思路,再用上了老师在课上演示过的man询问方法,最后解决问题,解决方式值得学习。
问题4(第十周的补充):编译fileinfo.c时显示warning警告信息。
-
5219宋歌博客链接:5219宋歌第十周问题
-
5219宋歌的解决方法:
不用解决,警告并不是错误,可以直接运行,警告信息是告诉我代码中发生了强制类型转换。
图4:
分析:编译代码时遇到个警告想必每个同学都会觉得心里一惊,把这个问题归纳出来就是告诉更多忽视它的同学。它是强制类型转换的警告。
问题5:char **myargv;
,为什么是**myargv
- 20145236冯佳博客链接:5236冯佳
ps:这是个关于argv文件夹
的文件的疑问
- 5236冯佳的解决方法:
经过查阅得知,比较准确的说法是: **相相当于二级指针,char **就是指向字符型指针的指针。最常使用的地方就是 int main(int argc,char **argv),相当于int main(int argc,char *argv[])。也就是说,可以看作是指向了字符串数组。
分析:不算严格意义上的问题,是带着问题学习。学习方法很好,类似的学前问题总结如下:
-
errno与error的区别
前者是记录系统最后一次错误的函数;后者是系统错误。
-
environ变量是什么? (environvar.c)
该变量指向一个叫environment的字符串数组。包括USER(登录用户的名字),LOGNAME(与user类似),HOME(用户登录目录),LANG(地域名),PATH等。
-
PIPE_BUF的值是多少?(consumer.c)
4096字节
-
FIFONAME是什么?
这里需要补充一下fifo的含义,它是一种文件类型,可以通过查看文件stat结构中的stmode成员的值来判断文件是否是FIFO文件。fifo是用来在进程中使用文件来传输数据的,也具有管道特性,可以在数据读出的时候清除数据。
问题6:who|sort是怎么实现的?
-
5212罗天晨博客链接:5212罗天晨
-
5212罗天晨的解决方法:
who把输出送给stdout,sort从stdin中读入数据,那也就是说who的stdout和sort的stdin连成了一个。
分析:首先问题就是使用指针会常用到的问题,初始化问题。然后提出了两种方式进行初始化,思路清晰。
问题7:exec
中传入的参数str
的结尾问题
-
5319钟轲博客链接:5319钟轲
-
问题描述:
在学习exec1的时候,本来以为
"arglist[2]"
是用来指定执行路径的,后面发现是execvp
函数要求传入的参数str
必须要以NULL
结尾,在执行psh1
的时候也证实了,最后一个输入确实是NULL
,但是为什么在我修改arglist[2]=".."
时,却依然能够正常执行呢?而单纯删除掉arglist[2]=0
时却显示是找不到路径? -
5319钟轲的解决方法:暂无
分析:这应该是本周问题里质量最高的一个,然而还是没有完全解决。是对输入结尾的讨论,我觉得钟轲前半部分分析很对,但是后面的操作有些问题。删掉的话直接会导致找不到路径,这让我想到大部分函数读入数据时,没有数据被读入,会返回0,如果发生错误,则返回EOF。还是有区别的。具体的还得娄老师来解析。
问题8:运行testpp.c代码时出现段错误
图5:
-
5227鄢曼君博客链接:5227鄢曼君
-
5227鄢曼君的解决方法:
问题在于没给pp分配空间就调用了pp[0],毕竟声明的时候只是一个指针,而指针必须要初始化。有两种解决办法:
(1)pp[0] = malloc(20);修改为pp = malloc(20); pp[0] = malloc(20); 然后即可成功。
(2)把pp[0] = malloc(20);去掉[0],这样就分配了20个字节给了pp这个数组指针,再编译运行就ok了。
图6:
图7:
总结完毕,祝大家都能取得好成绩。