Linux 系统编程之一 Unix、Linux 操作系统介绍

大纲

操作系统的作用

  • 方便:使计算机系统易于使用
  • 有效:以更有效的方式使用计算机系统资源
  • 扩展:方便用户有效开发、测试和引进新功能

操作系统的地位

操作系统在计算机系统中承上启下的地位:向下封装硬件,向上提供操作接口。

linux-coding-1

Unix/Linux 介绍

Unix 家族史

  • 1965:贝尔实验室(Bell Labs)加入一项由通用电气和麻省理工学院合作的计划,该计划要建立一套多使用者、多任务、多层次的 MULTICS 操作系统,后来因为项目太为复杂失败
  • 1969:其主要开发者 Thompson(后被称为 Unix 之父)和 Ritchie 领导一组开发者,开发了一个新的多任务操作系统 — UNICS,后来被改名为 Unix,最初的 Unix 是用 B 语言和汇编语言混合编写而成
  • 1971:两人在贝尔实验室共同发明了 C 语言,并于 1973 用 C 语言重写了 Unix
  • 1974:Unix 第一次出现在贝尔实验室以外。此后 Unix 被政府机关,研究机构,企业和大学注意到,并逐渐流行开来
  • 1980:有两个最主要的 Unix 的版本线,一个是 Berkeley 的 BSD Unix,另一个是 AT&T 的 Unix,两者的竞争最终引发了 Unix 的战争,最终导致 Unix 出现各种各样的变种版本
  • 1982:AT&T 基于版本 7 开发了 Unix System Ⅲ 的第一个商业版本,并不再开源
  • 1992~2001:由于版权问题,AT&T 公司与 BSD 开发组开始了一场将近 10 年的版权官司。Unix 由于其昂贵的费用,仅局限于大型机的应用;BSD 因为版权问题,失去了宝贵的发展时期

Linux 家族史

  • Minix(mini-Unix)最初是由 Andrew Tanenbaum 教授,仿照 4.3 BSD 的源代码,白手起家完成了 12000 行 C 语言的编写工作,这个系统只是一个教学工具,没有什么实际应用价值
  • 1990 年,Linus Torvalds 决定编写一个自己的 Minix 内核,初名为 Linus' Minix,意为 Linus 的 Minix 内核,后来改名为 Linux,此内核于 1991 年正式发布,并逐渐引起人们的注意
  • Linux 操作系统的诞生、发展、和成长过程依赖于五个重要支柱:Unix 操作系统、Minix 操作系统、GNU 计划、POSIX 标准和互联网
  • GNU 计划:GNU 是 GNU is Not Unix 的递归缩写,由 Richard M.Stallman 于 1984 年创办,旨在开发一个免费、类 Unix 的操作系统 。GNU 系统及其开发工具包括:Emacs 编辑系统、BASH Shell 程序、GCC、GDB 等,这些开发工具都是 GNU 组织的产品
  • 1992 年 Linux 与其他 GNU 软件结合,完全自由的操作系统正式诞生。该操作系统往往被称为 GNU/Linux 或简称 Linux
  • POSIX 标准:POSIX 标准定义了操作系统应该为应用程序提供的接口标准,POSIX 标准用来统一 Unix、Linux 各分支编程接口,以提高其通用型和可移植性

Linux 的远亲

linux-coding-3

Linux 的两类用户

linux-coding-2

Linux 和 Unix 的联系

  • Unix 系统是工作站上最常用的操作系统,它是一个多用户、多任务的实时操作系统,允许多人同时访问计算机,并同时运行多个任务。Unix 系统具有稳定、高效、安全、方便、功能强大等诸多优点,自 20 世纪 70 年代开始便运行在许多大型和小型计算机上
  • Unix 虽然是一个安全、稳定且功能强大的操作系统,但它也一直是一种大型的而且对运行平台要求很高的操作系统,只能在工作站或小型机上才能发挥全部功能,并且价格昂贵,对普通用户来说是可望而不可及的,这为后来 Linux 的崛起提供了机会,Linux 是一个类 Unix 操作系统
  • Linux 是免费的、不受版权制约、与 Unix 兼容的操作系统
  • Linux 在 x86 架构上实现了 Unix 系统的全部特性,具有多用户多任务的能力,同时保持了高效性和稳定性,Linux 具有如下优秀的特点:
    • 开放性
    • 完全免费
    • 多用户
    • 多任务
    • 良好的用户界面
    • 设备独立性
    • 提供了丰富的网络功能
    • 可靠的系统安全性
    • 良好的可移植性

Linux 内核及发行版

Linux 内核版本

内核(Kernel)是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序,它提供了一个在裸设备与应用程序间的抽象层。Linux 内核源码的官网:https://www.kernel.org,所有来自全世界的对 Linux 源码的修改最终都会汇总到这个网站,由 Linus 领导的开源社区对其进行甄别和修改,最终决定是否进入到 Linux 主线内核源码中。Linux 内核版本又分为稳定版和开发版,两种版本是相互关联,相互循环:

  • 稳定版:具有工业级强度,可以广泛地应用和部署。新的稳定版相对于较旧的只是修正一些 Bug 或加入一些新的驱动程序
  • 开发版:由于要试验各种解决方案,所以变化很快

Linux 发行版本

Linux 发行版 (也被叫做 GNU/Linux 发行版) 通常包含了包括桌面环境、办公套件、媒体播放器、数据库等应用软件。这些操作系统通常由 Linux 内核、以及来自 GNU 计划的大量的函式库和基于 X Window 的图形界面组成,在 X Window 中用户同样可以通过使用鼠标对窗口、菜单等进行操作来完成相应的工作。X Window 系统是一个非常出色的图形窗口系统,是类 UNIX 系统的图形用户界面的工业标准,其最重要的特征之一就是它的结构与设备无关。X Window 系统的主要特点如下:

  • X Window 系统是客户端 / 服务端架构的,它的实现是与操作系统内核分开的,其主要由 X Server 和 X Client 两部分组成
  • X Window 系统不是 Unix/Linux 操作系统的必须的构成部分,而只是一个可选的应用程序组件

附:2014 年与 2015 年最流行的 Linux 发行版的排行榜如下:

POSITION20152014
1Linux MintLinux Mint
2DebianUbuntu
3UbuntuDebian
4openSUSEopenSUSE
5FedoraFedora
6MageiaMageia
7ManjaroArch
8CentOSElementary
9ArchCentOS
10ElementaryZorin

Unix/Linux 开发应用领域

  • Unix/Linux服务器:是目前 Unix/Linux 应用最多的一个领域,可以提供 Web、FTP、Gopher、SMTP/POP3、Proxy/Cache、DNS 等服务器,支持服务器集群,支持虚拟主机、虚拟服务等。
  • 嵌入式 Linux 系统:嵌入式 Linux 是将流行的 Linux 操作系统进行剪裁修改,能够在嵌入式计算机系统上运行的一种操作系统。Linux 嵌入式系统能够支持多种 CPU 和硬件平台,性能稳定,剪裁性好,开发和使用容易,其中包括 Embedix、uCLinux、muLinux 等。
  • 桌面应用:近年来,Linux 系统特别强调在桌面应用方面的改进,目前已经完全可以作为一种集办公应用、多媒体应用、网络应用等多方面功能于一体的图形界面操作系统,在办公应用方面,Unix/Linux 集成了 OpenOffice、SUN 公司的 StarOffice 以及 KOffice 等工具。
  • 电子政务:随着 Linux 的快速发展,Linux 已逐渐成为 Windows 系统重要的竞争力量。尤其是 Linux 在安全性方面的独特优势,又使得 Linux 在政府应用领域得到很大的发展。目前一些国家正将其电子政务系统向 Linux 平台迁移。中国政府也对 Linux 给予极大的支持。

Linux 文件系统

目录

  • 目录是一组相关文件的集合
  • 一个目录下面除了可以存放文件之外还可以存放其他目录,即可包含子目录
  • 在确定文件、目录位置时,DOS 和 Unix/Linux 都采用 路径名 + 文件名 的方式,路径反映的是目录与目录之间的关系

路径

Unix/Linux 路径由到达定位文件的目录组成。在 Unix/Linux 系统中组成路径的目录分割符为斜杠 /,而 DOS 则用反斜杠 ‘` 来分割各个目录。路径分为绝对路径和相对路径:

  • 绝对路径

    • 绝对路径是从目录树的树根 / 目录开始往下直至到达文件所经过的所有节点目录
    • 下级目录接在上级目录后面用 / 隔开
    • 绝对路径都是从 / 开始的,所以第一个字符一定是 /
  • 相对路径

    • 相对路径是指目标目录相对于当前目录的位置
    • 如果不在当前目录下,则需要使用两个特殊目录 ... 了,这里的目录 . 指向当前目录,而目录 .. 指向上级目录

一切皆文件

Unix/Linux 对数据文件(.mp3、.bmp),程序文件(.c、.h、.o),设备文件(LCD、触摸屏、鼠标),网络文件(Socket)等的管理都抽象为文件,使用统一的方式方法管理。在 Unix/Linux 操作系统中也必须区分文件类型,通过文件类型可以判断文件属于可执行文件、文本文件还是数据文件。值得一提的是,在 Unix/Linux 系统中文件可以没有扩展名,文件名区分大小写。

文件的类型

通常,Unix/Linux 系统中常用的文件类型有 5 种:普通文件、目录文件、设备文件、管道文件和链接文件。

  • 普通文件:普通文件是计算机操作系统用于存放数据、程序等信息的文件,一般都长期存放于外存储器(磁盘、磁带等)中。普通文件一般包括文本文件、数据文件、可执行的二进制程序文件等
  • 目录文件:Unix/Linux 系统把目录看成是一种特殊的文件,利用它构成文件系统的树型结构,每个目录文件至少包括两个条目,.. 表示上一级目录,. 表示该目录本身
  • 链接文件:似于 Windows 下的快捷方式,链接又可以分为软链接(符号链接)和硬链接
  • 管道文件:管道文件也是 Unix/Linux 中较特殊的文件类型,这类文件多用于进程间的通信
  • 设备文件:Unix/Linux 系统把每个设备都映射成一个文件,这就是设备文件。它是用于向 I/O 设备提供连接的一种文件,分为字符设备和块设备文件。字符设备的存取以一个字符为单位,块设备的存取以字符块为单位。每一种 I/O 设备对应一个设备文件,存放在 /dev 目录中

文件的权限

文件权限就是文件的访问控制权限,即哪些用户和组群可以访问文件以及可以执行什么样的操作。Unix/Linux 系统是一个典型的多用户系统,不同的用户处于不同的地位,对文件和目录有不同的访问权限。为了保护系统的安全性,Unix/Linux 系统除了对用户权限作了严格的界定外,还在用户身份认证、访问控制、传输安全、文件读写权限等方面作了周密的控制。在 Unix/Linux 中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录。

访问用户

通过设定权限可以从以下三种访问方式限制访问权限:

  • 只允许用户自己访问(所有者):所有者就是创建文件的用户,用户是所有用户所创建文件的所有者,用户可以允许所在的用户组能访问用户的文件
  • 允许一个预先指定的用户组中的用户访问:用户组由不同的用户组成,例如,某一类或某一项目中的所有用户都能够被系统管理员归为一个用户组,一个用户能够授予所在用户组的其他成员的文件访问权限
  • 允许系统中的任何用户访问(其他用户):用户也可以将自己的文件向系统内的所有用户开放,在这种情况下,系统内的所有用户都能够访问用户的目录或文件。在这种意义上,系统内的其他所有用户就是 other 用户类

访问权限

用户能够控制一个给定的文件或目录的访问权限,一个文件或目录可能有读、写及执行权限:

  • 读权限(r):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限
  • 写权限(w):对文件而言,具有新增、修改、删除文件内容的权限;对目录来说,具有创建、删除、移动目录内文件的权限
  • 可执行权限(x):对文件而言,具有执行文件的权限;对目录来说,该用户具有进入目录的权限

linux-coding-6

  • a) 第 1 个字母代表文件的类型:d 代表文件夹、- 代表普通文件、c 代表硬件字符设备、b 代表硬件块设备、s 表示管道文件、l 代表软链接文件
  • b) 后 9 个字母依次代表三组权限:文件所有者、用户组、其他用户拥有的权限
    • 第一组权限控制访问自己的文件权限,即所有者权限
    • 第二组权限控制用户组其中一个用户访问文件的权限
    • 第三组权限控制其他所有用户访问文件的权限
  • c) 这三组权限赋予用户不同类型(即所有者、用户组和其他用户)的读、写及执行权限,这就构成了一共有 9 种类型的权限组

Linux 目录结构说明

  • /:根目录,一般根目录下只存放目录,在 Linux 下有且只有一个根目录,所有的东西都是从这里开始。当在终端里输入 /home,其实是在告诉系统,先从 /(根目录) 开始,再进入到 home 目录
  • /bin、/usr/bin: 可执行二进制文件的目录,如常用的命令 ls、tar、mv、cat 等
  • /boot:放置 Linux 系统启动时用到的一些文件,如 Linux 的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub
  • /dev:存放 Linux 系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱命令 mount /dev/cdrom /mnt
  • /etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有 /etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d
  • /home:系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,~ 表示当前用户的家目录,~edu 表示用户 edu 的家目录
  • /lib、/usr/lib、/usr/local/lib:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助
  • /lost+fount:系统异常产生错误时,会将一些遗失的片段放置于此目录下
  • /mnt、/media:光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,但也不一定,可以选择任意位置进行挂载
  • /opt:给主机额外安装软件所摆放的目录
  • /proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有 /proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/*
  • /root:系统管理员 root 的家目录
  • /sbin、/usr/sbin、/usr/local/sbin:放置系统管理员使用的可执行命令,如 fdiskshutdownmount 等。与 /bin 不同的是,这几个目录是给系统管理员 root 使用的命令,一般用户只能查看而不能设置和使用
  • /tmp 一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下
  • /srv:服务启动之后需要访问的数据目录,如网页服务需要访问的网页数据存放在 /srv/www
  • /usr:应用程序存放的目录,例如 /usr/bin 存放应用程序,/usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件,/usr/local 存放软件升级包,/usr/share/doc 系统说明文件存放目录,/usr/share/man 程序说明文件存放目录
  • /var:放置系统执行过程中经常变化的文件,例如 /var/log:存放随时更改的日志文件,/var/spool/mail:存放邮件的目录,/var/run:程序或服务启动后,其 PID 存放的目录

Windows 和 Linux 文件系统

在 Windows 平台下,打开 计算机 界面,可以看到的是一个个的驱动器盘符,而每个驱动器都有自己的根目录结构,这样形成了多颗树并列的情形,如下图所示:

linux-coding-4

在 Linux 下,是看不到这些驱动器盘符,看到的只有文件夹(目录)。在早期的 UNIX 系统中,各个厂家各自定义了自己的 UNIX 系统文件目录,比较混乱。Linux 面世不久后,对文件目录进行了标准化,于 1994 年对根文件目录做了统一的规范,推出 FHS(Filesystem Hierarchy Standard)的 Linux 文件系统层次结构标准。FHS 标准规定了 Linux 根目录各文件夹的名称及作用,统一了 Linux 界命名混乱的局面。和 Windows 操作系统类似,所有 Unix/Linux 的数据都是由文件系统按照树型目录结构管理的,而且 Unix/Linux 操作系统同样要区分文件的类型,判断文件的存取属性和可执行属性。但 Unix/Linux 文件系统不使用驱动器这个概念,而是使用单一的根目录结构,所有的分区都挂载到单一的 / 目录上,其结构示意图如下图所示:

linux-coding-5