(全)2017-10-11 第三次 信息安全系统设计基础课 主要内容
第二次课考试来着,所以就没写,第三次课课上讲了些知识,所以就整理一下。
预览可能字比较小不方便看,可以点击进来看。
本次课老师讲的是第十章,系统调用,一共讲了三方面的内容:who命令和系统调用和一些小技巧。
学习linux主要是学习三个方面:
1.学习linux命令,
2.学习系统调用,
3.学习具体命令,如od,是怎么实现的(先用伪代码,用汉语把问题解决,然后再用c语言写产品代码)
知识分三类,有元知识,软知识,硬知识,元知识学会了就能举一反三,软知识就是用量、用实践来做就能掌握,硬知识就是背下来就好了,
接下来是第一个内容:who命令
who命令的功能是给出用户信息,因为linux是个多用户操作系统,会给出当前的用户的登录信息。
如果没用过who怎么办呢?就用
man who
命令,可以查看帮助文档,
(紧接着老师又举了一个别的例子,来讲述为什么左上角的WHO旁边有个(1))
给大家举个例子,printf,但是man printf是查找printf的帮助文档吗?
其实不是了,man 3 printf
才是printf的帮助文档,man 1 printf
不是,
最终得出规律:找c语言函数——man 3,找系统调用——man 2,找终端命令行——man 1
(好了,例子举完了)
用
who -a
就可以把多个用户的登录信息显示出来了。who的内容有三列,用户名、终端、登录时间
接下来的任务就是用编程实现who,(我们要通过utmp来编程实现who)直接看一下who的帮助文档,输入
man who
,
然后老师说了,看帮助文档时一定要注意看SEE ALSO这里,SEE ALSO与系统调用有关。
看下面这张图有个utmp,
这个utmp文件保存的就是当前用户的登录信息,我们试着用vi查看一下utmp里面的信息,
发现都是一堆乱码对吧,utmp是二进制文件,怎么看呢?用我们上节课学过的od -tc -tx1 utmp
就可以了,
用
man utmp
查看帮助文档,发现utmp是一个系统文件,因为utmp旁边的数字是5,
我们可以得知utmp是一个结构体,包含ut_line和ut_user等项目,
因此我们得到了用c编程实现who的方法:
1.打开utmp,
2.循环打印用户名、时间、终端等,
3.关闭utmp。
接下来是第二个内容:使用系统调用!
我们有什么不懂的,都会去百度上搜一下,现在什么函数不懂,可以输入man -k xxx,比如我们搜索
man -k read
,搜索read头文件,
可以发现出现了很多很多不需要的文件,所以我们可以输入man -k read | grep 2
做一个筛选,
其实还可以再精确一下,输入man -k read | grep 2 | grep read
,结果所有含有read的都显示出来了,
终于找到了read,并且得出结论:我们只需要知道自己要干什么就行了,有不会的函数就去用man和grep搜索,
再用man 2 read看一下帮助文档,要格外注意的是这里:
SYNOPSIS(大纲、摘要)内容包含这个read
函数使用时,所必须的头文件,
还有的SYNOPSIS文件里包涵其他内容,可能还有链接库,比如求正弦的函数:
sin
,这时就得把他的链接库也一并写上,
否则就不能使用,
(好了举完了sin的例子,我们再回来看man read帮助文档)
再看SEE ALSO这里,有个open,open是和文件最相关的一个命令了,
我们打开帮助文档:man open
,可以看到了有三个头文件,所以都要调用。
(以后比如毕设时问你头文件哪里来的,一定要会说!)
所有的代码都放在一个main函数里不是一个好的习惯,要学会分模块,要会函数分离,有利于提高代码质量。
接下来是第三个问题——一些小技巧,比如:读代码时遇到宏,读不懂怎么办?
c语言中经常用到stdio.h,linux下使用
locate stdio.h
就可以查到stdio.h的位置了,
还有一个小技巧:
grep -nr
,其中r是递归调用,这个指令可以将搜到的东西打印在第n行,
搞破坏之前要先备份一下,用
cp who1.c who1back.c
可以实现备份。
copy命令怎么用c语言实现呢?
1.打开fd1,
2.创建fd2,循环:从fd1读取100个字节,并写到fd2里,
3.关闭fd1,fd2.
提问:从fd1里读了100个字节,fd2里就有100个字节吗?
回答:不是的,fd1里的字节数多于100个的话,只读100个,如果不够100个比如三十个, 就只会读三十个。
所有的知识都讲完了,接下来是课堂测验!
MR.LOU:“我讲了两个例子了,接下来该你们了。”