学习笔记1(教材第1、2章)

学习笔记

第一章对书的写作对象、Unix和linux版本的历史沿革、如何搭建虚拟机平台,将Ubuntu 映像系统安装到Windows系统中的virtual 虚拟机以及VMware虚拟机的操作方法、用户权限和安全性等内容进行了精炼的介绍。并简单介绍了unix/Linux常用命令、文件类型、文件系统组织。我通过检视阅读学习第一章,快速地对第一章涵盖知识进行了梳理。我们开发出来的程序一般都是放在Linux下运行的,我之前一直对此有疑问,为什么都放在linux下而不是放在Windows系统当中,但通过本章内容以及查阅相关资料,我了解到linux相对于Windows系统有以下几个优点:

(1)不用钱(这点非常重要)

(2)环境相对安全稳定

(3)linux环境承载了很多的软件,有较好的软件生态环境

第二章先介绍了几种Linux中的文本编辑器:vim、gedit、emacs。其中就个人的使用体验而言,vim是功能最强大、最方便的一款。vim有一个经常见到的键盘图,用于查询vim的相关指令。

接下来讲到gcc,gcc是一个程序,是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。

GCC 原名为 GNU C语言编译器,因为它原本只能处理 C 语言,但如今的 GCC 不仅可以编译 C、C++ 和 Objective-C,还可以通过不同的前端模块支持各种语言,包括 Java、Fortran、Ada、Pascal、Go 和 D 语言等等。

GCC 的编译过程可以划分为四个阶段:预处理(Pre-Processing)、编译(Compiling)、汇编(Assembling)以及链接(Linking)。

对静态和动态链接可以从以下两个方面去理解

硬链接: 与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块

软链接: 保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径(简单地理解为 Windows 中常见的快捷方式)。

第二章的后半部分讲到了c语言结构体、链表处理、树二叉树等内容,这些知识点在大二上的《数据结构》课程中都细讲过,是比较基础的东西,对于部分遗忘的细节可以通过快速阅读书籍回想起来。c语言程序中的变量可分为全局变量、局部变量、静态变量、自动变量和寄存器变量。需要注意的是,全局变量在函数外定义。局部变量在函数内定义。全局变量具有唯一性,并且只有一个副本。静态全局变量仅对定义他们的文件可见。非静态全局变量则对同一程序的所有文件都可见。默认情况下,局部变量是自动变量,他们在函数调用时出现,按逻辑在函数退出时消失。静态局部变量具有永久性和唯一性。课本中对于C语言的知识点总结得非常全面,可以C语言复习的材料。

知识点归纳以及自己最有收获的内容

知识点:

(1)unix/linux常用命令

可用 pwd命令查看用户的当前目录

可用 cd 命令来切换目录

.表示当前目录

.. 表示当前目录的上一级目录(父目录)

-表示用 cd 命令切换目录前所在的目录
表示用户主目录的绝对路径名
·  ls:显示文件或目录信息

·  mkdir:当前目录下创建一个空目录

·  rmdir:要求目录为空

·  touch:生成一个空文件或更改文件的时间

·  cp:复制文件或目录

·  mv:移动文件或目录、文件或目录改名

·  rm:删除文件或目录

·  ln:建立链接文件

·  find:查找文件

·  file/stat:查看文件类型或文件属性信息

·  cat:查看文本文件内容

·  more:可以分页看

·  less:不仅可以分页,还可以方便地搜索,回翻等操作

·  tail -10: 查看文件的尾部的10行

·  head -20:查看文件的头部20行

·  echo:把内容重定向到指定的文件中 ,有则打开,无则创建

(2)Sudo命令:执行命令时临时将用户进程提升到超级用户级别。完成命令执行后,用户进程将恢复到原来的特权级别。

(3)Vim的3中操作模式:

命令模式:用于输入命令

插入模式:用于输入和编辑文本

末行模式:用于保存文件并退出

(4)可执行的文件的分类:

内置命令:出于效率的考虑,将一些常用命令的解释程序构造在Shell内部。

外置命令:存放在/bin、/sbin目录下的命令

实用程序:存放在/usr/bin、/usr/sbin、/usr/share、/usr/local/bin等目录下的实用程序

用户程序:用户程序经过编译生成可执行文件后,可作为Shell命令运行

Shell脚本:由Shell语言编写的批处理文件,可作为Shell命令运行

(5)通配符的类型
*:匹配任何字符和任何数目的字符

?:匹配单一数目的任何字符

[ ]:匹配[ ]之内的任意一个字符

[! ]:匹配除了[! ]之外的任意一个字符,!表示非的意思

(6)a.out文件内容

文件头:包含a.out文件的加载信息和大小

代码段:包含程序的可执行代码

数据段:包含初始化全局变量和初始化静态数据

符号表:仅为运行调试所需

我们可通过两种方法来终止正在执行a.out的进程

正常终止:如果程序执行成功,main最终会返回到crt0.o调用库函数exit(0)来终止进程

异常终止:进程遇到错误时,按下“ctrl+c”或使用命令:

(7)c语言结构体

c语言结构体类型由struct关键字定义。

Next:指向下一个节点结构体的指针

Key:一个整数

Name:一个由64个字符组成的数组

此类结构体可定义为:


Sruct node{

  Struct node *next:

Int key:

Char name[64]:

}

Struct node可作派生类型来定义该类型的变量。

注:定义c语言结构体时,该结构体的每个字段都必须具有一个编译器已知的类型,但自引用指针除外。一个结构体的大小可以由sizeof(struct type)确定。

(8)链表


Typedef struct node{

  Struct node *next;

  Int value;

Char name[];

}NODE;

链表是一种由一系列节点组成的数据结构,这些节点通过节点的next指针链接在一起,即每一个节点的next指针指向列表中的下一个节点。

(9)树和二叉树

最简单的树是二叉树,其每个节点都有两个指针,分别是左指针和右指针。


Typedef sruct node{

   Int key;

   Struct node *left;

   Struct node *right;

}NODE;

二叉树的遍历算法:

先序遍历:node;node.left;node.right

中序遍历:node.left;node;node.right

后序遍历:node.left;node.right.node

深度优先(DF)

广度优先(BF)

最有收获的内容:

这两章我最有收获的内容是了解到了Linux系统的结构和它的文件系统目录。我还了解到超级用户命令的启用方法、过程,这让我对Linux文件系统、编程过程有了更加深入的了解,Linux是一个多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件,继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。另外,我认为Linux的文件系统非常优秀,它支持多文件系统,而且安全性很高。另一方面,之前在听课或者是编程的时候会在想老师为什么要编那么多的文件目录对文件进行分类存放,不同的文件目录存放的文件类型又有什么讲究呢?后来从书中了解到linux的组成架构,让我清楚不同的文件夹的的内容。例如bin 存放二进制可执行文件(ls,cat,mkdir等)、etc 存放系统配置文件、opt 额外安装的可选应用程序包所放置的位置、root 超级用户目录。文件类型分为目录文件和非目录文件,更细的话非目录文件主要是符号链接,我们常见的就是普通文件,目录和符号链接。

问题与解决思路

问题1:通过书知道linux系统由linux内核(linus 团队管理)、shell、文件系统、第三方应用软件。Shell这个词天天听到,但并不知道它的本质究竟是什么?

解决思路:从定义上看,Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口(命令解释器),下面一张流程图可以解释shell的主要功能。

在此基础上我们知道shell是解释命令的一个装置,像一个乌龟壳一样包住了系统内核,探了个头与外面的用户进行交互。我们可以通过shell进行命令行解释、调整命令的多种执行顺序,进行I/O重定向、替换命令等等,我们目前使用的shell版本一般是bash(bourne again shell)

问题2:之前在听课或者是编程的时候会在想老师为什么要编那么多的文件目录对文件进行分类存放,不同的文件目录存放的文件类型又有什么讲究呢?

解决思路:通过查阅相关资料和阅读书籍15页,我了解到了Linux 文件系统是一个目录树的结构,文件系统结构从一个根目录开始,根目录下可以有任意多个文件和子目录,子目录中又可以有任意多个文件和子目录。目录中存放的主要内容和目录树的结构图如下所示:

bin 存放二进制可执行文件(ls,cat,mkdir等)
boot 存放用于系统引导时使用的各种文件
dev 用于存放设备文件
etc 存放系统配置文件
home 存放所有用户文件的根目录
lib 存放跟文件系统中的程序运行所需要的共享库及内核模块
mnt 系统管理员安装临时文件系统的安装点
opt 额外安装的可选应用程序包所放置的位置
proc 虚拟文件系统,存放当前内存的映射
root 超级用户目录
sbin 存放二进制可执行文件,只有root才能访问
tmp 用于存放各种临时文件
usr 用于存放系统应用程序,比较重要的目录/usr/local 本地管理员软件安装目录
var 用于存放运行时需要改变数据的文件

问题3:>和>>有何区别?

解决思路:自己在linux系统上进行测试运行时发现了这个问题,>是覆盖方式重定向到新的文件;>>是以补充方式,添加到原文件的末尾。

具体可见该图,用用长格式列出目录/usr/bin目录下的所有文件,输出重新定向到文件out99,检查结果;用长格式列出目录/etc目录下的所有文件,输出结果补充到文件out99末尾。

posted @ 2021-09-14 22:48  爱冒险的丁丁  阅读(71)  评论(0编辑  收藏  举报