APUE读书笔记(一)

一. 基础知识

1.1 体系结构

系统调用:内核的接口
应用程序既可以使用共用函数库,也可以使用系统调用

1.2 登录

登录项的组成:登录名、加密口令、数字用户 ID(UID)、数字组 ID(GID)、注释字段、起始目录、shell 程序

1.3 目录

每个进程都有一个工作目录(当前工作目录),相对路径都从工作目录开始解析
进程可以使用 chdir 函数更改工作目录

1.4 输入输出

1.4.1 文件描述符

文件描述符是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表
取值范围为 0 到 OPEN_MAX(每个进程最多可以打开 的文件数-1,63)

1.4.2 标准输入、标准输出和标准错误

标准输入、标准输出和标准错误是在运行新程序时,shell 为程序默认打开的 3 个文件描述符

1.5 程序和进程

内核使用 exec 函数将程序读入内存并执行程序
fork 函数创建一个新进程,该进程(子进程)是调用进程(父进程)的一个副本
在创建时,对父进程返回子进程 ID,对子进程返回 0

1.6 线程

一个进程内的所有线程共享同一地址空间、文件描述符、栈以及与进程相关的属性

1.7 出错处理

errno:Unix 系统函数出错时返回的负值
关于 errno:

  • 如果没有出错,其值都不会被例程清除
  • 任何函数都不会将 errno 设置为 0

关于错误:

  • 出错分为致命性的和非致命性的
  • 对于致命性错误,可打印出错消息或者写入日志
  • 对于非致命错误,可以尝试重试(延时、指数补偿算法)

1.8 用户标识

1. 用户 ID

用户不可更改其用户 ID
用户 ID 为 0 的用户为 root 用户或超级用户

2. 组 ID

组文件将组名映射为数字的组 ID,位于/etc/group

3. 附属组 ID

系统允许用户属于另外一些组,一个用户属于多至 16 个其他的组

1.9 信号

信号用于通知进程发生了某种状况
处理信号的方式:

  • 忽略
  • 系统默认方式处理
  • 提供函数,信号发生时调用,即捕捉信号

1.10 时间

日历时间:自 UTC 时间的秒数累计值
进程时间:也叫做 CPU 时间,用来度量进程使用的 CPU 资源,以时钟 tick 计算
系统为进程维护的三个进程时间值:

  • 时钟时间,进程运行的时间总量(与系统同时运行的进程数有关)
  • 用户 CPU 时间,执行用户指令所用的时间量
  • 系统 CPU 时间,为该进程执行内核程序经历的时间量

用户 CPU 时间和系统 CPU 时间常称为 CPU 时间

1
2
# 度量执行时间
time -p <command>

1.11 系统调用和库函数

系统调用:提供给程序向内核请求服务的,操作系统提供的入口点
区别:

  • 库函数可以被替换,而系统调用通常不可替换
  • 应用程序既可以调用 系统调用,也可以调用 库函数
  • 许多库函数会调用系统调用
  • 系统调用通常是提供最接口,而库函数通常提供较复杂的功能
  • 进程控制系统调用(fork/exec/wait)通常有用户应用程序直接调用