zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Linked list
    mysql(1)

    mysql 1130 问题
    POST乱码
    GET乱码(2)
    GET乱码
    P65——练习题2.31
    2.1.9 C语言中的移位运算
    2.1中所想的问题:指针的类型有什么作用?
  • 原文地址:https://www.cnblogs.com/Ressurection-20191320/p/15252996.html
Copyright © 2011-2022 走看看