APUE读书笔记1-UNIX基础知识

本文最后更新于:2021年6月20日 下午

本章主要介绍有关UNIX操作系统的一些基本概念和术语,并简要说明UNIX提供的各种服务

UNIX体系结构

  1. 操作系统被定义为一种软件,它控制计算机硬件资源并提供程序运行环境。
  2. 操作系统内核的接口被称为系统调用。公共函数库既可以构建在系统调用接口之上,应用程序既可以使用公用函数库,也可以使用系统调用。
  3. UNIX shell是一个特殊的应用程序,它为运行其他应用程序提供了一个接口。
  4. shell是一个命令行解释器,它读取用户输入,然后执行命令。
  5. shell的输入通常来自于终端(交互式shell)或来自于文件(shell脚本)。

文件和目录

  1. UNIX文件系统是目录和文件的一种层次关系,文件系统的起点是称为“根”(以字符“/”表示)的目录。

  2. 目录中的各个名字称为文件名,只有斜线(/)和空字符不能出现在文件名中。创建新目录时会自动创建.和.两个文件名,其中.指向当前目录,..指向父目录。

  3. 以斜线(/)分隔的一个或多个文件名组成的序列构成路径名

    • 以斜线(/)开头的路径名称为绝对路径名
    • 以非斜线(/)开头的路径名称为相对路径名
    • 文件系统根的名字(/)是一个特殊的绝对路径名,它不包含文件名
  4. 每个进程都有一个工作目录(或称为当前工作目录),所有相对路径名都从工作目录开始解释。

输入和输出

  1. 文件描述符通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。
  2. 每当运行新程序时,shell都会为其打开3个文件描述符,即标准输入、标准输出以及标准错误。
  3. 函数openreadwritelseek以及close使用不带缓冲的I/O。这些函数都使用文件描述符。
  4. 标准I/O函数为那些不带缓冲的I/O函数提供了带缓冲的接口。使用标准I/O函数时无需担心最佳缓冲区大小。

程序和进程

  1. 程序是存储在磁盘上某个目录中的可执行文件。内核使用exec函数(7个exec函数之一)将程序读入内存,并执行程序。
  2. 程序的执行实例被称为进程(process)。
  3. UNIX系统确保每个进程都有一个唯一的非负数字标识符,称为进程ID。
  4. 用于进程控制的函数主要有forkexec、和waitpid
  5. 通常,一个进程只有一个控制线程(thread)——某一时刻执行的一组机器指令。为了充分利用多处理器系统的并行能力,可以在一个进程中创建多个线程。
    • 一个进程中的所有线程共享同一地址空间、文件描述符、栈以及进程相关的属性
    • 多线程能够访问进程中的同一存储区,因此各线程在访问共享数据时需要采取同步措施以避免不一致性
    • 与进程相同,线程也采用线程ID唯一标识。但是,线程ID只在它所属的进程内起作用

出错处理

​ UNIX系统函数出错时,通常返回一个负值,而且整型变量errno通常被设置为具有特定信息的值。

  • 文件<errno.h>中定义了errno以及各种可以向errno赋值的以字符E开头的常量
  • 多线程环境中,每个线程都有属于自己的局部errno,以避免线程之间的相互干扰

用户标识

  • 用户ID:标识系统中的各个不同的 用户,用户ID为0的用户为根用户,其登录名为root,它具有超级用户特权
  • 组ID:用户所属组的标识
  • 附属组ID:一个用户可以属于附属组,由附属组ID标识

信号

​ 信号(signal)用于通知进程发生了某种情况。进程有3种处理信号的方式:

  • 忽略信号
  • 按系统默认方式处理
  • 提供信号捕捉函数。信号发生时调用该函数并按照预期的方式处理信号

时间值

  1. UNIX系统使用过两种不同的时间值
    • 日历时间:自协调世界时(UTC)1970年1月1日00:00:00以来所经过的秒数累计值。UNIX使用基本数据类型time_t保存这种时间值
    • 进程时间:也称为CPU时间,用来度量进程使用的中央处理器时间。进程时间以时钟滴答计算。UNIX使用基本数据类型clock_t保存这种时间值
  2. UNIX系统为一个进程维护3个进程时间值:
    • 时钟时间:又称为墙上时间,它是进程运行的时间总量,其值与系统中同时运行的进程数有关
    • 用户CPU时间:是指执行用户指令所用的时间量
    • 系统CPU时间:是指为该进程执行内核程序所经历的时间

系统调用和库函数

  1. UNIX提供良好定义、数量有限、直接进入内核的入口点。这些入口点被称为系统调用。
  2. UNIX为每个系统调用在标准C库中提供了一个具有同样名字的函数。用户进程使用标准C调用序列来调用这些函数。
  3. 从用户角度看系统调用与库函数的区别并不重要,但系统调用通常提供该功能的最小接口,而库函数则在用户层面提供比较复杂的功能。

APUE读书笔记1-UNIX基础知识
http://yoursite.com/2021/06/03/APUE读书笔记1-UNIX基础知识/
作者
BinGoo
发布于
2021年6月3日
许可协议