第一、二章学习笔记

第一、二章学习笔记

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

Unix/Linux系统编程

0. 虚拟机上的Linux

由于之前在VMware安装较多虚拟机,,故本次Linux-Ubuntu-64依旧选择在VMware中下载。
第一、二章学习笔记

第一章 Unix/Linux介绍

1. 引言

  • 本教材涵盖
    • 1)Unix/Linux所有基本组件(进程管理,并发编程,文件系统,定时器和时钟服务,网络编程,MySQL数据库系统)
    • 2)编程实践

2. About Unix

  • Unix是一种通用操作系统,诞生于20世纪70年代早期,在贝尔实验室的PDP-11微型计算机开发。AT&T Unix(美国电话电报公司)、Berkeley Unix(实现TCP/IP协议族和套接字接口)、HP Unix、IBM Unix、Sun Unix。

3. 关于Linux

  • Linux是一个类Unix系统,包含其他Unix系统的许多特性,是由各种最为流行的Unix系统组合而成。主要的Linux平台仍然是基于Intel x86的个人计算机,可免费使用,便于安装。除不同的发行版本之外,所有Linux内核都完全相同。
    以下列出一些最流行的Linux发行版:Debian Linux(free)、Ubuntu Linux(基于Debian)、Linux Mint(基于Debian & Ubuntu的社会主导型Linux发行版)、基于RPM的Linux(Red Hat Linux和SUSE Linux是最早使用RPMP文件格式的主要发行版)、Slackware Linux。

4. 使用Linux

  • Ⅰ)Linux内核映像
    Linux内核映像位于 /boot目录中,可启动的Linux内核映像名为vmlinuz-generic-VERSION_NUMBER, initrd是Linux内核的初始ramdisk映像.
    一个可启动的Linux内核映像由三部分组成:
    | BOOT | SETUP | linux kernel |
    BOOT:一个512字节的启动程序,用于从软件映像启动早期的Linux版本,现在不再用于Linux启动,而是包含一些参数,以供 ”SETUP” 使用;
    SETUP:是一段16位和32位的汇编代码,用于在启动期间将16位模式转换为32位保护模式;

  • Linux kernel:是Linux的实际内核映像(采用压缩格式,但在开始时有一段解压代码,用于解压Linux内核映像并将其放入高端内存中);

  • Ⅱ)Linux启动程序
    最流行的:GRUB、LILO

  • Ⅲ)Linux启动
    Linux启动加载程序首先会定位Linux内核映像(文件)。然后:

    • 加载BOOT+SETUP至实模式内存的0x90000处
    • 加载Linux内核至高端内存的1MB处。
      加载程序会将初始的ramdisk映像initrd加载到高端内存中,然后转移控制权,运行0x90200处的SETUP代码,启动Linux内核。
      首次启动时,Linux内核会将initrd作为临时根文件系统,在initrd上运行。Linux内核将执行一个sh脚本,该脚本指示内核加载实际根设备所需的模块。当实际根设备被激活并准备就绪时,内核将放弃初始ramdisk,将实际根设备挂载为根文件系统,从而完成Linux内核的两阶段启动。
  • Ⅳ)Linux运行级别
    Linux内核以单用户模式启动。可模仿System V Unix的运行级别,以多用户运行。

  • Ⅴ)登录进程
    在终端上打开三个文件流:stdin(用于输入),stdout(用于输出),stderr(用于错误输出)。然后等待用户登录。

  • Ⅵ)命令执行。
    登录后,用户进程通常会执行命令解释程序sh,后者将提示用户执行命令。sh将直接执行一些特殊命令,如cd、exit、logout、&。非特殊命令通常是可执行文件。对于非特殊,命令,sh会复刻子进程并等待该子进程终止。
    子程序会将其执行映像更改为文件,并执行新映像。子进程在终止时会唤醒父进程sh,后者将提示执行另一个命令等。

5. 使用Ubuntu Linux

  • Ⅰ)Ubuntu版本
    使用Ubuntu Linux15.10或更高版本(我用的是最新安装的20.04.3),原因如下:

    • ① 易于安装
    • ② 易于通过
    • ③ 通过发布新版本来定期更新和改进
    • ④ 拥有庞大的用户群,很多问题和解决方案都发布在网上论坛中
    • ⑤ 方便连接无线网络和接入互联网
  • Ⅱ)Ubuntu Linux的特性
    用户账户默认主目录为“/home/username”,当Ubuntu启动时,它会立即在用户环境中运行,因为其已自动登录默认用户。
    快捷键:Ctrl + ALT + T 打开一个伪终端

  • 出于安全原因,用户应为普通用户,而不是根用户或超级用户。要执行任何特权命令,用户必须输入 sudo command

  • 我安装的是64位的Ubuntu Linux,运行练习题代码时需要用:gcc -m32 filename.c

6.Unix/Linux文件系统组织

  • Unix/Linux文件系统采用树形组织结构,如下图:
    第一、二章学习笔记

  • Ⅰ)文件类型

    • (1)目录文件:一个目录可能包含其他目录和(非目录)文件

    • (2)非目录文件:为文件系统树中的叶节点
      常规文件

特殊文件
字符特殊文件:字符I/O
块特殊文件:块I/O

  • (3)符号链接文件:属于常规文件,其内容为其他文件的路径名。因此,这些文件是指向其他文件的指针;
    例如:Linux命令ln -s aVeryLongFileName myLink, 可创建一个符号链接文件”mylink”,其指向“aVeryLongFileName”,对“mylink”的访问将被重定向到实际文件“aVeryLongFileName”上。

  • Ⅱ)文件类型

    • (1)根目录:/
      以 “ / ” 开头的路径名为绝对路径名,
    • (2)当前工作目录(相对路径):
      反之则为相对于进程当前工作目录(CWD)的相对路径名,被设为用户的主目录。CWD可通过cd命令更改。pwd命令可打印CWD的绝对路径名。

7.Unix/Linux命令

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

  • Linux手册页:Ubuntu中保存在标准/usr/share/man目录下
    第一、二章学习笔记

8.Ubuntu Linux系统管理

  • Ⅰ)用户账户
    用户账户信息保存在/etc/passwd文件中,该文件归超级用户所有,但任何人都可以读取。在表单的/etc/passwd文件中,每个用户都有一个对应的记录行:
    loginName : x : gid : uid : usefInfo : homeDir : initialProgram
    其中第二个字段“x”表示检查用户密码。加密的用户密码保存在/etc/shadow文件中

  • Ⅱ)添加新用户
    大致用途:以不同的用户身份添加一个家庭成员,以便使用同一台计算机
    sudo adduer username
    通过为新用户创建账户和默认的主目录/home/username来添加新用户

  • Ⅲ)sudo命令
    处于安全原因,Ubuntu禁用了根或超级用户账户, sudo可提权至超级用户,
    为确保能够使用sudo,用户名必须保存在/etc/sudoers文件中,只需在sudoers文件中添加一行:username ALL(ALL) ALL。
    注:该文件格式非常严格,文件中的任何语法错误都可能破坏系统安全性。Linux建议只使用特殊命令visudo来编辑该文件。

第二章、编程背景

1. Linux中的文本编辑器

Ⅰ)vim

三种不同的操作模式:命令模式、插入模式、末行模式

  • h:将光标向左移动一个字符;k:将光标向上移动一行
  • l:将光标向右移动一个字符;j:将光标向下移动一行;
  • i:插入文本;a:追加文本;按ESC至命令模式;
  • 输入”:”进入末行模式:
  • :w 写入(保存文件);
  • :q 退出vim;
  • :wq 保存并退出
  • :q! 不保存更改,强制退出
  • Ctrl+C: 中止或退出
  • Ctrl+Y: 删除行到缓冲区
  • Ctrl+S: 保存已编辑文本等
Ⅱ)gedit 是GNOME桌面环境默认的文本编辑器
Ⅲ)emacs 是一款强大的文本编辑器,可在多个不同的平台上运行
``具体操作:emacs [FILENAME]`


顶部为菜单栏,中间为C代码缓冲区,按meta键序列“Ctrl+X+C”, 以保存文件并退出
Emacs菜单
  •    Option菜单支持配置emacs操作的功能
    
  •  Buffers用于缓冲区选择和显示
    
  •   Tools菜单支持编译源代码、执行二进制可执行文件和调试
    
  •   C菜单支持自定义编辑C源代码
    
  •   Help菜单包含简单的emacs教程
     Emacs集成开发环境:emacs不仅是一款文本编辑器,还为软件开发提供了一个集成开发环境(IDE),其中包括C语言程序、运行可执行的映像以及用GDB执行调试程序。
     C标准注释行包含匹配的“/*”符号和“*/”符号对。
    

C知识点汇总

第一、二章学习笔记

  • 全局变量在函数外定义,具有唯一性,并且只有一个附本。
  • 静态全局变量仅对定义它们的文件可见。
程序开发步骤:
  • (1)创建源文件

  • (2)用gcc把源文件转换成二进制可执行文件
    如 gcc t1.c t2.c

makefile

1.1Makefile介绍

Makefile的核心是“自动化编程”,简单的make命令就可以使庞大的系统照我们自定义的依赖规则和执行命令的顺序进行编译。其中Makefile最重要的语法是
target:prerequisites
Command
其中有两条规则:

  1. 要得到target,需要执行命令command;
  2. Target依赖prerequisites,当prerequisites中至少有一个文件比target文件更新的时候,command才被执行。

1.2Makefile工作

在默认的方式下,当我们输入make命令时:

  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。
  3. 如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
  4. 如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
  5. 当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件声明make的终极任务,也就是执行文件edit了。
    说明:make会一层一层地去找文件的依赖关系,直到编译出第一个目标文件,在找寻的过程中,如果出现错误,那么make就会直接退出,并报错;make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么make就不工作了。

课堂笔记

  • 运行C语言代码的具体操作
    在Ubuntu下运行
    第一、二章学习笔记
    下图为查看可执行文件二进制的方法
    第一、二章学习笔记
    下图为运行可执行文件
    第一、二章学习笔记
    第一、二章学习笔记

杂 通过看书

回顾之前所学

重构二叉树目前主要是采取递归的方式,只能通过前序,中序或者后续,中序进行重构,而前序和后序是不能够重构的,因为在得知根节点后只有中序遍历才能确定左子树和右子树的数目。
二叉树几种遍历列举
前序遍历:根结点 —> 左子树 —> 右子树
中序遍历:左子树—> 根结点 —> 右子树
后序遍历:左子树 —> 右子树 —> 根结点
层次遍历:只需按层次遍历即可

查阅资料

以先序和后序遍历重构二叉树为例:
(1)首先先序中的第一个元素一定是二叉树的根节点。根据这个根节点找到在中序中的位置,那么这一位置左边的元素全部是二叉树的左孩子,这一节点的所有右边节点全部是二叉树的右孩子。
(2)其次构造右子树和左子树。构造思路是:从先序和中序中找到左子树和右子树的先序和中序序列,然后递归构造,直至所有节点使用完。即得到重构的二叉树。

3.总结

通过思考我总结了以下关于如何用中序或者后序遍历来重构二叉树的解题步骤:
1、后序遍历的最后一个节点即为根节点;
2、根据根节点,在中序遍历中找出左子树和右子树,并统计左子树和右子树的个数;
3、递归构建左子树和右子树。

问题与解决思路

  1. 【Linux Ubuntu】安装vim
    输入sudo apt-get install vim后出现问题(Ubuntu单进程,被占用)
    遇到的问题:无法获得锁 /var/lib/dpkg/lock-frontend,锁正由进程 14640(unattended-upgr)持有的问题
    当时忘截图了,出现的提示语是:
    E: 无法获得锁 /var/lib/dpkg/lock-frontend锁正由进程 xx(unattended)持有。
    N: 请注意,直接移除锁文件不一定是合适的解决方案,且可能损坏您的系统。
    E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
    解决方案:用ps-aux | apt-get 查看占用进程的pid(一般为四位数,我遇到的是五位),之后在终端输入kill -9 进程号即可。
上一篇:UNIX 系统


下一篇:信息安全系统设计与实现第一周:《Unix/Linux系统编程》第一、二章学习笔记