20191320-2021-2022-1-diocs 学习笔记1

第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的三个文件流:stdinstdoutstderr


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:打开对应标签

程序开发过程:

  1. IDE
  • 代码文档编辑工具:
    • vim
    • gedit
    • emacs
    • vscode
  • C语言编译工具:
    • gcc
  • C语言调试工具:
    • gdb
  • 项目管理、编译:
    • make
  1. 编译过程
  • 预处理:先处理库、宏等,生成的还是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
  1. 程序编写时应该注意:高内聚,低耦合。利用面向对象的思想,将对象所做的函数和功能进行封装,同时,使用多种方式降低代码重写率,使用函数,将程序拆分为小部分,逐个完成。

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,并使用其进行编译。

动态库:
动态库不在编译时链接程序,在程序运行时才会进行加载和使用,所以在多次使用的情况下相比静态库更节省空间。
使用方法:

  1. 先编译为.o: gcc -c -fPIC hello.c
  2. 然后创建动态库.so: gcc -shared -o libmylib.so mysum.o
  3. 生成需要动态库的可执行文件:gcc t.c -L. -lmylib
  4. 执行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

posted @ 2021-09-14 20:38  20191320  阅读(23)  评论(0编辑  收藏  举报