学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

时间:2023-03-08 22:23:42

0.目录

1.概念

2.系统资源

3.学习方法

4.从用户的角度来理解 Unix

5.从系统的角度来理解 Unix

6.小结

1.概念

概念:

  • Unix 系统包含用户程序和系统内核
  • 内核由多个子系统构成
  • 内核管理所有的程序和资源
  • 进程之间的通信对 Unix 程序是很重要的
  • 什么是系统编程

相关命令:

  • bc

一些术语:

  • 内存空间用来存放程序和数据,所有的程序都必须在内存空间中才能运行。
  • 用来容纳操作系统的内存空间叫做系统空间,容纳应用程序的内存空间叫做用户空间。
  • 操作系统也被称为内核。

什么是系统编程:

  • 程序要访问设备(如键盘、磁盘和打印机)必须通过内核,所以只有内核才能直接管理设备。程序如果要从键盘得到数据,必须向内核发出请求,若在显示器上显示结果,也要通过内核,程序中所有对设备的操作都是通过内核进行的。内核向程序提供服务以便程序能够访问到设备。
  • 解释了这些内容后,再来看什么是系统编程。编写普通程序时可以认为,程序是直接连到键盘、显示器、磁盘等设备的,但在进行系统编程时,必须对系统的结构和工作方式有更深的了解,要知道内核提供哪些服务( 系统调用 ),如何使用它们,系统有哪些资源和设备,不同的资源和设备该如何操作。

2.系统资源

内核提供服务以便系统程序可以直接访问系统资源,那么有哪些系统资源和服务呢?

  1. 处理器(Processor)
    • 程序是由指令构成的,处理器是执行指令的硬件设备,一个系统中可能有多个处理器。内核能够安排一个程序何时开始执行,何时暂时停止、恢复执行,何时终止执行。
  2. 输入输出(I/O)
    • 程序中所有输入/输出的数据、终端的输入/输出数据还有硬盘输入/输出数据,都必须流经内核,这种集中的处理方式有以下优点:正确性,数据流不会流错地方;有效性,程序员无需考虑不同设备之间的差异;安全性,数据信息不会被未被授权的程序非法访问。
  3. 进程管理(Process Management)
    • 进程指程序的一次运行,每个进程都有自己的资源,如内存、打开的文件和其他运行时所需的系统资源。内核中与进程相关的服务有新建一个进程、中止进程、进程调度等。
  4. 内存(Memory)
    • 内存是计算机系统中很重要的资源,程序必须被装载到内存中才可以运行。内核的职责之一是内存管理,在需要的时候给程序分配内存,当程序不需要的时候回收内存,内核还能够保证内存不被其他的进程非法访问。
  5. 设备(Device)
    • 计算机系统中可以有各种各样的外设,如磁带机、光驱、鼠标、扫描仪和数码摄像机等,它们的操作方式各不相同,内核能屏蔽掉这种差异,使得对设备的操作方式简单而统一。例如,一个程序想要从数码照相机中取出照片存储在计算机中,它只需向内核提出操作该资源的请求即可。
  6. 计时器(Timers)
    • 程序的工作与时间有关,有的需要定时被触发,有的需要等一段时间再开始某个动作,有的需要知道某一个操作消耗的时间,这些都涉及计时器,内核可以通过系统调用向应用程序提供计时器服务。
  7. 进程间通信(Interprocess Communication)
    • 在现实生活中人们通过电话、e-mail、信件、广播、电视等互相通信,在计算机的世界中,不同的进程也需要互相通信,内核提供的服务使进程间通信成为可能。就像电信和邮政提供的服务,通信也是资源。
  8. 网络(Networking)
    • 网络之间的通信可以看作是进程间通信的特殊形式,通过网络,不同主机上的进程,即使使用的是不同操作系统,也可以互相通信。网络通信也是内核提供的服务。

3.学习方法

本书通过以下 3 个步骤来学习:

  1. 分析程序
    • 首先分析现有的程序,了解它的功能及实现原理。
  2. 学习系统调用
    • 看程序都用到哪些系统调用,以及每个系统调用的功能和使用方法。
  3. 编程实现
    • 利用学到的原理和系统调用,自己编程实现原来程序所实现的功能。

以上 3 步可以通过下面 3 个问题来实现:

  • 它能做什么?
  • 它是如何实现的?
  • 能不能自己编写一个?

4.从用户的角度来理解 Unix

4.1 登录——运行程序——注销

用户登陆时,系统启动单独的一个 shell 进程来处理该用户的请求(多用户环境);用户注销时,系统结束分配给该用户的 shell 进程。
学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

4.2 目录操作

用户登录后,可以对自己的文件进行操作。文件中可以有 e-mail、图片、源程序、可执行程序等各种各样的数据。文件被组织在目录中。

目录树:
学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

目录操作命令:

  1. ls——列出目录内容
    学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述
  2. cd——改变当前目录
    1. cd 命令的作用是改变当前的目录。当刚刚登录到系统中时,当前目录是自己的主目录,可以通过 cd 命令转到其他目录,如:
      学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述
  3. pwd——显示当前目录
    学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述
  4. mkdir、rmdir——新建、删除目录
    学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

目录操作命令的工作原理:

  • 涉及到系统怎么保存描述目录树的信息,以及不同目录操作命令对应的对这些信息的修改。

4.3 文件操作

文件存放在目录中,用户文件位于用户自己的主目录中,系统文件位于系统目录中。

文件命名规则:

  • 每个文件都有文件名,在大多数的 Unix 系统中,文件名最长可以是 250 个字符,很多字符都可以出现在文件名中,如大小写字符、标点符号、空格、tab,甚至回车符,但是不能包含根目录符号“/”。

文件操作命令:

  1. cat,more,less,pg——查看文件的内容
    学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述
  2. cp——文件复制
    学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述
  3. rm——文件删除
    学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述
  4. mv——重命名或移动文件
    学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述
  5. lpr,lp——打印文件
    学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

文件操作命令的工作原理:
同样涉及到系统怎么保存文件的控制信息和文件的数据信息,以及不同的文件操作命令对应的对这些信息的修改。

文件许可权限:
系统中每个用户都有自己的文件,出于很多原因,你不会希望别的用户能够修改自己的文件,甚至读也不行。系统中有一些管理命令,如果使用得不好会对系统造成损害,管理员不希望普通用户也有运行这些命令的权力。这些对文件和命令操作的限制是如何行使的呢?
学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

每个文件都有文件所有者和 3 组许可权限:
学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

5.从系统的角度来理解 Unix

5.1 网络桥牌

许多人都玩网络桥牌这个游戏,世界各地的玩家通过计算机网络连接到一起,游戏开始以后,参加者就可以看到一个共同的牌桌,能够看到别人出的牌,图 1.9 是一个简单的说明。
学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

图 1.9 中有 4 个人,他们每人都有一台计算机,通过网络连接在一起。但图 1.9 中还少了牌桌,下面把它加上,如图 1.10 所示。
学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

图 1.10 中增加了第 5 个实体——牌桌,牌桌位于服务器上,在 4 个玩家的眼里,牌是放在牌桌上的,他们也是通过牌桌才能够开始游戏。

在现实生活中玩牌的时候,人们轮流出牌,但在网络游戏中,是由谁来控制该哪一个人出牌?牌又存放在哪里?某个人手中有几张牌又意味着什么?如何来保证不让两个人有同一张牌?这在现实生活中不会有任何问题,但在虚拟的网络中确实要仔细考虑。

图 1.11 显示了在网络桥牌中的信息流。
学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

网络桥牌的例子展示了 Unix 系统编程中 3 个重要的方面。

  • (1) 通信
    1. 某个用户或进程如何与其他用户或进程交换信息?
  • (2) 协作
    1. 在同一个时刻,网络桥牌的两个用户不会都去拿同一张牌,程序如何来协调多个进程使他们能够没有冲突地访问共享资源?
  • (3) 网络访问
    1. 在这个例子中,互相独立的计算机通过网络连接到一起,那么计算机中的程序是如何来使用网络的呢?

5.2 bc:Unix 的计算器

Unix 系统中的 bc 命令是执行一个基于字符的计算器程序,bc 有两个重要的特点。

要启动这个计算器,只要输入:
学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

bc 的另一个重要特点是,从严格的意义上讲,bc 并不做任何计算。为了说明这一点,做如下操作:
学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

ps 命令可以列出系统中运行的所有进程,这里一共有 4 个进程,除了两个 bc 外,bash 是 shell 进程,那么 dc 是什么?
在大多数的 Unix 系统中都提供了联机帮助,可以从那里得到需要的信息,要找关于 dc 的信息,只要输入:
学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述
学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

读了 bc 的联机帮助就会知道,bc 是 dc 的预处理器,它将用户输入的表达式转换成逆波兰表达式,然后通过一个称为管道(pipe)的通信程序交给 dc,如图 1.12 所示。
学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

用户输入中缀表达式如“2+2”,bc 将它转化为相应的后缀表达式形式,交给 dc 执行,dc 计算表达式的值,将结果返回给 bc,bc 再将结果以合适的形式显示在显示器上。所以对普通用户而言,bc 就是计算器。

5.3 从 bc/dc 到 Web

学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

6.小结

  • 计算机系统中包含了很多系统资源,如硬盘、内存、外围设备、网络连接等,程序利用这些资源来对数据进行存储、转换和处理。
  • 多用户系统需要一个*管理程序,Unix 的内核就是这样的程序,它可以对程序和资源进行管理。
  • 用户程序要访问设备必须经过内核。
  • 一些 Unix 的系统功能是由多个程序的协作而实现的。
  • 要编写系统程序,必须对系统调用和相关的数据结构有深人的理解。