第1章 引言——教材知识点归纳
1.1~1.11
这些小节介绍了本书主要介绍的内容:即Unix/Linux系统的相关知识和其系统中的一些编程应用。
1.12虚拟机上的Linux
本小节讲如何使用虚拟机安装并使用Linux。其实我们已经在大一上期完成了次任务。但通过对书本的学习,我也更加熟悉了虚拟机和Linux系统。在大一学习时,已经使用virtualbox装了ubuntu,但后来出现问题,虚拟机启动和速度很慢,我在本次学习中使用VMWare重新安装了Ubuntu最新版本。
1.13使用Linux
本小节介绍了很多使用linux的重要内容,包括linux的基础知识。
Linux内核位置:
/boot
Linux内核映像的三部分:BOOT|SETUP|linux kernel
Linux的三个文件流:stdin
、stdout
和stderr
Linux最常用命令:
cd:更改目录
exit:退出
logout:注销
sudo apt install:安装应用程序
sudo:使用root权限执行
ls:lsdirname:列出CWD或目录的内容。
pwd:打印CWD的绝对路径名。
touch filename:更改文件名时间戳(如果文件不存在,则创建文件)。
cat filename:显示文件内容。
cp src dest:复制文件。
mv src dest:移动或重命名文件。
mkdir dirname:创建目录。
rmdir dirname:移除(空)目录。
rm filename:移除或删除文件。
find:搜素文件
grep:搜索文件中包含模式的行。
ssh:登录到远程主机
tar-zcvffile.tgz:从当前目录创建压缩tar文件。
tar-zxvffile.tgz:从tgz文件中解压文件。
man:显示在线手册页。
zip file.zip filenames:将文件压缩为.zip文件。
unzip file.zip:解压.zip文件。
history:查看历史命令。
!数字:执行第"数字"条命令。
1.15Unix/Linux文件系统组织
第2章 编程背景——教材知识点归纳
2.1Linux中的文本编辑器
Linux中,文件编辑、文本编辑是必不可少的基本操作。首先学习vim,即使用命令行进行文本编辑,若熟练掌握其中的命令,就可以很快完成。gedit:类似于Windows中的记事本,是一个简单的图形界面文本编辑器。emacs:更加强大,具有更多功能的图形界面文本编辑器。
2.2使用文本编辑器
Vim使用键位图:
使用3个窗口的vim来开发程序:分别用来编写代码、调试、运行。
2.3程序开发步骤(重要)
在ubuntu中尝试了上课所讲的开发过程。
快捷键:
^+alt+T
:打开终端
^+shift+T
:打开新标签
alt+num
:打开对应标签
程序开发过程:
- IDE
- 代码文档编辑工具:
- vim
- gedit
- emacs
- vscode
- C语言编译工具:
- gcc
- C语言调试工具:
- gdb
- 项目管理、编译:
- make
- 编译过程
- 预处理:先处理库、宏等,生成的还是C代码文件。
gcc -E xx.c -o xx.i
- 编译: 将C代码转换为汇编代码。
gcc -S xx.i -o xx.s
- 汇编: 汇编语言转为二进制文件。
gcc -C xx.s -o xx.o
- 链接: 链接为可执行文件。
gcc xx.o -o a.out
- 程序编写时应该注意:高内聚,低耦合。利用面向对象的思想,将对象所做的函数和功能进行封装,同时,使用多种方式降低代码重写率,使用函数,将程序拆分为小部分,逐个完成。
2.4-2.5
此段主要介绍C程序在执行过程中的底层细节,包括函数的调用过程、堆栈使用情况、以及C代码和汇编代码的链接。从汇编指令的层面分析了程序执行过程中的细节。
2.6链接库
链接库包含预编译的目标代码,有静态链接库和动态链接库之分。
代码:
- 伪代码 (注释和描述)
- 产品代码 (函数、模块)(没有main) xx.c->xx.h
- 测试代码 (有main)
项目管理:
- 头文件:
/include
*.h
- 源文件:
/src
*.c
- 库:
/lib
*.o
- 二进制可执行:
/bin
*.out
- 文档:
/doc
*.md
……
编译时用:gcc -Iinclude -c src/hello.c -o libs/hello.o
将模块进行编译。若不给出源代码而是给出库的.o文件,编译时用:gcc src/testhello.c libs/hello.o -Iinclude -o bin/hw1
其中-Iinclude
指示头文件的位置。
运行时用:bin/hw
注意所有操作均在项目根目录下进行就可以!
静态库:
将多个.o进行打包就成了静态库。使用ar rcs libhello.a xx.o yy.o
。注意静态库需用libxxx.a的格式进行规范命名。
用静态库编译:gcc src/testhello.c -Iinclude -Llibs -lhello -o bin/hw2
其中,-lhello
就是找libhello.a,并使用其进行编译。
动态库:
动态库不在编译时链接程序,在程序运行时才会进行加载和使用,所以在多次使用的情况下相比静态库更节省空间。
使用方法:
- 先编译为.o:
gcc -c -fPIC hello.c
- 然后创建动态库.so:
gcc -shared -o libmylib.so mysum.o
- 生成需要动态库的可执行文件:
gcc t.c -L. -lmylib
- 执行
export LD_LIBRARY_PATH=./
./a.out
2.7makefile
makefile用来管理和编译项目。makefile是一个文件,在使用make命令时,会读取这个文件并对项目按照文件内容进行编译。make文件由一系列目标项、依赖项、规则组成。
例子:
一个C程序,三个源文件:type.h、mysum.c、t.c
使用gcc编译: gcc -o a.out main.c mysum.c
使用makefile:有一个名为Makefile的文件:
myt:type.h t.c mysum.c #依赖列表
gcc -o myt t.c mysum.c #rule命令,make时执行。
2.8 GDB调试工具
gdb断点设置指令总结:
(gdb)break 7 //以行号设置断点
(gdb)break function_name //以函数名设置断点
(gdb)clear 行号 //删除这行的断点
(gdb)clear 函数名 //删除该函数的断点
(gdb)delete breakpoints n //删除第n次(指定编号)设置的断点
(gdb)clear //删除程序中所有的基于行设置的断点
(gdb)delete //删除程序中所有的断点
(gdb)r //执行程序
(gdb)n //单步调试
(gdb)c //执行到下一个断点
(gdb)print 变量或表达式 //打印变量或表达式当前的值。
(gdb)print 变量=值 //对变量进行赋值
(gdb)whatis 变量或表达式 //显示变量类型
(gdb)set variable 变量=值 //变量赋值
2.9-2.12数据结构与算法
书中介绍了C结构体、指针等C语言基础内容,同时介绍了数据结构与算法的知识。我们学习过数据结构课程,以下为重要数据结构和算法知识。
链表:是一种线性结构,由数据和指针连接而成,有单链表、双向链表、循环链表等类别。有多种操作,其中插入节点、删除节点复杂度为O(1),读取一个节点复杂度为O(n),在C语言中可使用结构体和指针完成。
树:树形结构,每个节点有一个父节点和多个子节点,其中最简单的树为二叉树,除根节点和叶节点外,每个节点有一个父节点,两个子节点,二叉树应用广泛,有深度优先遍历、广度优先遍历和层序遍历,也可用二叉树表示普通树,应用有哈弗曼编码、二叉平衡搜索等。
实践内容过程、问题解决过程
ubuntu虚拟机安装和使用
曾经安装了ubuntu18.04,后因不明原因VirtualBox虚拟机出现问题,重新安装了VMWare虚拟机,和Ubuntu20.04。
在安装过程中,安装完系统后,需要安装VMware Tools增强工具,但这个工具和VirtualBox的安装方法不太一样,首先该工具打包为.tar.gz,在网上搜索了使用linux解压这种包的方法:tar -xzf file.tar.gz
即可解压。
解压完成后,需要通过.pl文件进行安装,需要安装perl,然后用root执行.pl文件即可。如图:
随后就完成了安装,通过解决问题,网上搜索,学习到linux命令行下.tar和.tar.gz文件解压方法、.pl的程序安装方法,很有收获。
程序开发实例练习
随后使用ubuntu实行了实际操作,按照课上讲的目录和源代码文件管理方法进行了一个小项目的完成。虽然项目只是完成了hello makefile的输出,但是使用了较为规范的项目文件目录和开发流程。
打开窗口和创建文件:
头文件的编写:
经过多次调试,最终程序编译运行成功,如下图。
遇到的问题:
第一次在写好程序后,编写makefile时,忘记在Makefile中注明路径,导致出错。
后来加入路径,调整编译指令后的makefile:
又有在编写时,忘记为程序代码加上类型,导致声明的函数类型和实际不同,编译器报出警告,后来在阅读警告内容后,加上了sayhello函数的类型。
最终的状态:
代码链接
代码包括一些以前的代码,在码云。链接:https://gitee.com/Ressurection20191320/code/tree/master/IS