20191305李天琦1.2章学习笔记

20191305第1、2章学习笔记

1、笔记

第一章是书的引言部分,介绍了书的范围、Unix的历史、如何将Ubuntu Linux同时安装到Microsoft Windows中的virtual 虚拟机和VMware虚拟机上。还简单提到了unix/Linux常用命令、文件类型、文件系统组织等内容。我花了大概3小时来学习第一章,其中有很多内容比如虚拟机上的Linux、Linux命令等等,是我在大一时就接触到的,所有我很快就能回想起19年时在虚拟机上进行Linux编程的场景。但这本书上的内容更加深入、细致地谈到了Linux是怎样启动、工作的以及用户权限和安全性等问题。第一章的最后提到了sudo命令,我以前误以为sudo命令有启用超级用户的功能,直到看了书中17页的内容我才发现Ubuntu禁用了根或超级用户,sudo命令只是允许用户以超级用户的身份执行命令,执行完后用户进程将恢复到原来的级别。这明显是更加安全的。

第二章首先介绍了几种Linux中的文本编辑器:vim、gedit、emacs。就我个人的使用体验而言,vim是功能最强大、可用性最好的一款。接着课本讲到了程序开发步骤:

(1)创建源文件

(2)用gcc把源文件转换成二进制可执行文件

c语言程序中的变量可分为全局变量、局部变量、静态变量、自动变量和寄存器变量。需要注意的是,全局变量在函数外定义。局部变量在函数内定义。全局变量具有唯一性,并且只有一个副本。静态全局变量仅对定义他们的文件可见。非静态全局变量则对同一程序的所有文件都可见。默认情况下,局部变量是自动变量,他们在函数调用时出现,按逻辑在函数退出时消失。静态局部变量具有永久性和唯一性。这是课本中总结得非常全面的。

(3)gcc是一个程序,它主要保护三个步骤。

第一步:将c源文件转换为汇编代码文件

第二步:把汇编代码转换为目标代码(通常是二进制代码)。

第三步:链接
我们都知道默认的二进制可执行文件名为a.out,但对其内容几乎没有了解。书中第页讲到,a.out的内容包括4个部分:

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

(2)代码段: 也叫正文段,代码段从标准c启动代码crt0.o开始

(3)数据段

(4)符号表: 
我们可通过两种方法来终止正在执行a.out的进程

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

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

第二章的后半部分讲到了c语言结构体、链表处理、树二叉树等内容,这些知识点在大二上的《数据结构》课程中都细讲过。

2、知识点归纳

知识点:

(1)unix/linux常用命令

ls:ls dirname:列出CWD或目录的内容
cd dirname:更改目录
pwd:打印CWD的绝对路径名
touch filename:更改文件名时间戳
cat filename:显示文件内容
cp src dest:复制文件
mv src dest:移动或重命名文件
mkdir dirname:创建目录
rmdir dirname:移除目录
In oldfile newfile:在文件之间创建链接
find:搜索文件
grep:搜索文件中包含模式的行
ssh:登录到远程主机
gzip filename:将文件压缩为.gz文件
gunzip file.gz:解压.gz文件
tar -zcvf file.tgz:从当前目录创建压缩tar文件
tar -zxvf file.提供者:从.tgz文件中解压文件
man:显示在线手册

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

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

命令模式:用于输入命令
插入模式:用于输入和编辑文本
末行模式:用于保存文件并退出

(4)a.out文件内容

文件头:包含a.out文件的加载信息和大小
代码段:包含程序的可执行代码
数据段:包含初始化全局变量和初始化静态数据
符号表:仅为运行调试所需

(5)c语言结构体

c语言结构体类型由struct关键字定义。
Next:指向下一个节点结构体的指针
Key:一个整数
Name:一个由64个字符组成的数组
此类结构体可定义为:
Sruct node{
Struct node *next:
Int key:
Char name[64]:
}
Struct node可作派生类型来定义该类型的变量。
注:定义c语言结构体时,该结构体的每个字段都必须具有一个编译器已知的类型,但自引用指针除外。一个结构体的大小可以由sizeof(struct type)确定。

(6)链表

Typedef struct node{
Struct node *next;
Int value;
Char name[];
}NODE;
链表是一种由一系列节点组成的数据结构,这些节点通过节点的next指针链接在一起,即每一个节点的next指针指向列表中的下一个节点。

(7)树和二叉树

最简单的树是二叉树,其每个节点都有两个指针,分别是左指针和右指针。
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)

3.收获:

这两章我最有收获的内容是Linux的文件系统组织。以前在编写完程序后,文件夹里会出现命名为bin、lib、dev等的文件夹,我并不知道这些文件夹是干什么的?有什么作用?他们的内容是什么?而书中的15页讲到了这一块,让我清楚不同的文件夹的的内容。例如bin(普通用户命令)、dev(设备文件)、lib(链接库)、sbin(超级用户命令)。文件类型分为目录文件和非目录文件。另外我还了解到超级用户命令的启用方法、过程,这让我对Linux文件系统、编程过程有了更加深入的了解,Linux是一个多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。另外,我认为Linux的文件系统非常优秀,它支持多文件系统,而且安全性很高。

posted @ 2021-09-14 18:34  20191305李天琦  阅读(53)  评论(0编辑  收藏  举报