20145316 《信息安全系统设计基础》第二周学习总结
教材学习内容总结
Linux系统下的开发环境
Linux下的开发环境主要有两类:
1.字符界面的开发环境
2.图形化的集成开发环境。
Linux下程序的开发环境和开发过程在字符界面下的开发环境中,一般使用Vi
、vim
或Emacs
文本编辑器来编写源程序,然后使用gcc
编译器来编译程序,当程序出现错误而不能实现既定的功能时,使用gdb
调试器来调试程序。如果开发的是一个大型程序,可能需要编写Makefile
文件来自动编译程序,并使用CVS
对项目进行管理。
vi的基本操作
一、vi的操作模式
vi提供两种操作模式:
输入模式(insert mode)
指令模式(command mode)。
在输入模式下,用户可输入文本资料。在指令模式下,可进行删除、修改等各种编辑动作。
在输入模式下,按Esc键切换到指令模式下。
在指令模式下,按输入指令(i、a、o等)进入输入模式。
二、进入vi
$ vi filename
直接键入“vi + 所要编辑的文件名”,即可对指定的文件进行编辑。
如果指定的文件为新文件,则提示:“New file”,否则显示该文件的当前内容。
$ view filename
以只读方式打开文件filename
三 指令模式
输入模式
a 在当前游标之后输入
A 在当前行之末输入
i 在当前游标之前输入
I 在当前行之首输入
o 在当前行之下新增一行,并在新增行输入
O 在当前行之上新增一行,并在新增行输入
输入结束后,按Esc键退出输入模式。
游标移动
h 向左移动一个字元
l 向右移动一个字元
j 向下移动一个字元
k 向上移动一个字元
b 左移一个单词,至词首
w 右移一个单词,至词尾
0 移到当前行行首
$ 移到当前行行尾
- 移至下一行的行首
- 移至上一行的行首
H 移至视窗的第一行
M 移至视窗的中间一行
L 移至视窗的最后一行
G 移至该文件的最后一行
nG 移至该文档的第n行
n+ 下移n行
n- 上移n行
视窗移动
删除操作
x 删除游标所在字元
X 删除游标前一字元
dw 从游标当前位置开始向后删除一个单词
db 从游标当前位置开始向前删除一个单词
d0 从行首删除至当前游标位置
d$ 从游标当前位置删除至行尾
dd 删除游标所在行
D 同d$
修改操作
s 修改游标所在字元,修改完成后按Esc键结束
S 修改整行内容,修改完成后按Esc键结束
r 替换当前游标所在字元
R 进入替换状态,直至按Esc键结束
cw 修改一个单词(从游标位置至词尾)
cb 修改一个单词(从词首至游标位置)
cc 修改整行内容,完成后按Esc键结束,同S
c0 修改行首至游标位置的内容
- c$ 修改游标位置至行尾的内容
- 游标所在字元大小写切换
指令重复
在指令模式中,可在指令前面加入一个数字n,则该指令会重复执行n次。常用的重复操作有:
nx 删除n个字元
ndd 删除n行
ns 修改n个字元
取消前一动作(Undo)
u 撤消上一指令的结果
查找字符串
/字符串 从当前游标向后查找该字符串
?字符串 从当前游标向前查找该字符串
n 从当前游标向后查找下一个字符串
N 从当前游标向前查找下一个字符串
查看编辑状况
四、保存与退出
:w 保存,但不退出
:wq 保存并退出
:x 同:wq
:q 退出,如果当前文件没有保存,禁止退出
:q! 不保存退出
:w file1 将内容保存至文件file1中,注意:此时编辑的仍为原文件
:w! file1 将内容覆盖保存至文件file1中,如文件file1存在,:w file1将禁止执行
五、环境设置
:set 显示已设置的环境状况
:set all 显示所有的环境设置选项
:set nu 显示行号
:set nonu 不显示行号
:set ts = n 设置Tab键的长度为n
六、执行指令
- 以下用具体的数字为例进行介绍,数字表示行数,游标所在行可用“.”代替,文件最后一行可用“$”代替。
- 10 , 20d 删除第10行至第20行的内容
:10d 删除第10行的内容
- :%d 删除全部内容
-
10 , 20co30 将第10行至第20行的内容复制到第30行之后
-
10 , 20mo30 将第10行至第20行的内容移动到第30行之后
-
1 , $s/old/new 将第1行至最后一行中的old替换成new
-
1 , $s/^/new 将第1行至最后一行的内容前面插入new
-
10 将游标移至第10行
七、重复指令
. 重复上一条指令
八、切换到shell状态
:sh 切换到shell状态,exit返回
gcc编译器的基本原理
1.调用cpp 进行预处理进行预处理,对源代码文件中的文件对源代码文件中的文件
包含(include)、预编译语句(如宏定义define
等) 进行分析;
2.调用cc1进行编译,生成.o为后缀的目标文件;
3.调用as进行汇编,汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件;
调用ld进行链接,所有的目标文件被安排在可执行程序中的恰当的位置执行程序中的恰当的位置。同时该程序所调程序用到的库函数也从各自所在的档案库中链接到合适的地方。
gcc的使用
gcc编译程序的流程(参数是ESc,文件的后缀是iso):
预处理:gcc –E hello.c –o hello.i
;gcc –E
调用cpp,产生预处理过的C原始程序
编译:gcc –S hello.i –o hello.s
;gcc –S
调用ccl,产生汇编语言原始程序
汇编:gcc –c hello.s –o hello.o
;gcc -c
调用as,产生目标文件
链接:gcc hello.o –o hello
;`gcc -o调用ld,产生可执行文件
运行:./hello
gcc编译常用选项:-E
(只预编译)、-S
(只编译不汇编)、-o
(将file文件指定为输出文件)、-c
(只编译不链接)、-I dir
(在头文件的搜索路径列表中添加dir目录)、-g
(在可执行程序中包含标准调试信息)
gdb调试技术
程序的运行状态有“运行”、“暂停”、“停止“三种。
主要操作:
查看文件:l
设置断点:在b后加入相对应的行号。例b 6
查看断点情况:设置完断点后键入info b
,在gdb
中可以设置多个断点。bt
查询调用函数的情况
运行代码:默认从首行开始运行代码,键入r
;r+
行号:从该行号开始运行
查看变量值:p
变量。例:p n
单步运行:n
或s
,s
会进入函数,n
不会进入函数
恢复程序运行:c
帮助信息:h
断点的设置:
函数:b
文件名.c:函数名
行:b
行数
条件:b
行数 if
表达式(例如:b 9 if == 12
)
临时:tb [文件名:]行号或函数名 <条件表达式>
makefile基本原理及语法规范
一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干个目录中。makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作。其带来的好处就是——“自动化编译”,一但写好,只需要一个make命令,整个工程完全编译,极大的提高了软件的开发效率。
makefile文件编写规则:
目标文件:由make
创建,通常是目标文件或可执行文件
依赖文件:创建目标体所依赖的文件
运行命令:创建每个目标体时需要的运行命令,必须以tab
键开头
格式为:目标文件:依赖文件列表 [tab键]各目标体运行命令
(注意不是空格)
使用make
的格式:make
目标文件
makefile
变量的定义:
递归展开方式:在引用该变量时进行替换(不能用于引用自己的情况),缺点:不能在变量后追加内容
格式定义:VAR = var
展开方式:在定义处展开,并只展开一次。优点:消除变量的嵌套引用
格式定义:VAR := var
make
中变量的使用格式: $(变量名)
变量名的命名:不包括“:”、“#”、“=”
以及结尾空格的任何字符串;变量名大小写不敏感
静态库和动态库的生成与调用方法
库选项:-static
(进行静态编译,即链接静态库、禁止使用动态库)、-shared
(生成动态库文件、进行动态编译,在没有动态库时才会链接同名静态库)、-L dir
(在库文件的搜索路径列表中添加dir目录)、-lname
、-fPIC
(生成使用相对地址的位置无关的目标代码,然后使用gcc的-static
选项从该PIC目标文件生成动态库文件)
静态库是一系列的目标文件(.o文件)的归档文件((lib+name).a文件);链接阶段,选择静态库,后缀名为“.a”,选择动态库,后缀名为“.so”。
静态链接库的生成:gcc -c
文件名.c ar rcsv libxxx.a xxx.o
;
静态库的使用:gcc -o
文件名 文件名.c -L. -lxxx //
链接到静态库;
注意:-L
:在库文件的搜索路径列表中添加dir目录,-l
: 在头文件的搜索路径列表中添加dir目录。
静态库示例:
(图中忘记加入tab,导致运行结果不正确)
共享库的生成:gcc -fPIC -c xxx.c gcc -shared -o libxxx.so xxx.o
;共享库的使用:gcc -o main main.c -L. -lxxx
注册共享库的方法:
修改/etc/ld.so.conf
文件
修改LD_LIBRARY_PATH
环境变量
将库文件直接复制到/lib或者/usr/lib目录下:cp (lib+name).so /lib
动态库示例:
C程序模块化
将C程序分解为各个模块有助于编程及调整程序、利用系统资源
教材学习中的问题和解决过程
启动虚拟机时遇到了 “磁盘DISK启动失败”的问题,查阅了相关资料,删除了下列 .lck文件解决了问题
本周代码托管截图
git链接:https://git.oschina.net/xxy745214935/linux
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 2/2 | 20/20 | |
第二周 | 56 /56 | 1/3 | 18/38 |