计算机 / 读书笔记 · 2021年12月19日 0

APIUE读书笔记chapter1

简记

1.2 Unix Architecture

1.3 Logging In

登录时,Unix系统在文件/etc/passwd中寻找相关的用户信息。/etc/passwd中的每一行代表了一个用户,由7个冒号分隔的字段构成:登录名,加过密的密码,用户ID,用户组ID,注释,该用户的home目录,该用户登录时要使用的shell。例如:

sar:x:205:105:Stephen Rago:/home/sar:/bin/ksh
  • 现在的Unix/Linux等系统已经把加密过的密码存到了单独的文件里。

关于man命令

可以用man [章节] <命令>的方式在指定章节中查询相应命令。关于章节:

 man 是系统的手册分页程序。指定给 man 的 页 选项通常是程序、工具或函数名。程序将显示每一个找到的相关 手册页。如果指定了 章节,man 将只在手册的指定  章节  搜索。默认将按预定的顺序查找所有可用的
   章节 (默认是“1 n l 8 3 2 3posix 3pm 3perl 5 4 9 6 7”,除非被 /etc/manpath.config 中的 SECTION 指令覆盖),并只显示找到的第一个 页,即使多个 章节 中都有这个 页面。
  下表显示了手册的 章节 号及其包含的手册页类型。

  1
  可执行程序或 shell 命令
  2
  系统调用(内核提供的函数)
  3
  库调用(程序库中的函数)
  4
  特殊文件(通常位于 /dev)
  5
  文件格式和规范,如 /etc/passwd
  6
  游戏
  7
  杂项(包括宏包和规范,如 man(7),groff(7))
  8
  系统管理命令(通常只针对 root 用户)
  9
  内核例程 [非标准

  一个手册 页面 包含若干个小节。

  小节名称通常包括  NAME,  概述(SYNOPSIS),  配置(CONFIGURATION),  描述(DESCRIPTION),  选项(OPTIONS),  退出状态(EXIT STATUS),  返回值(RETURN VALUE), 错误(ERRORS), 环境(ENVIRONMENT), 文件(FILES),
  版本(VERSIONS), 符合标准(CONFORMING TO), 注(NOTES), 缺陷(BUGS), 示例(EXAMPLE), 作者(AUTHORS), 和 亦见(SEE ALSO).

1.7 Error Handling

  1. 当Unix系统调用出错时,errno会被设定为相应的值以指示出错原因。为使用errno,需要引入头文件errno.h。
  2. 如何解读errno的值?查看errno.h,或者man errno,或者使用strerrorperror 这两个函数。
  3. POSIX和ISO C把errno定义为一个符号(a symbol expanding into a modifiable lvalue of type integer),可修改的整数类型的左值。以前的定义(historical definition)是extern int errno,但是在支持多线程的环境里,为了避免多个线程在使用errno时的混乱,需要每个线程有一个单独的errno。比如在Linux中,为支持多线程,将errno定义如下:
extern int *__errno_location(void);
#define errno (*__errno_location())

关于errno值得注意的两个地方:

  • 如果没有错误发生,errno的值就不会被更新;
  • errno的值不会被设为0,<errno.h>中的任何一个常量的值都不会是0;

1.8 User Identification

  1. user ID为0的用户称之为root/superuser
  2. /etc/group文件中存储了关于用户组的一些信息;
  • Supplementary Group IDs 从4.2BSD开始,每个用户可以属于至多16个额外的组。这些额外的组在登录的时候,通过读取/etc/group文件中的内容,选取前16个将该用户列为成员的组而得到。所以一个用户到底至多可以属于多少个组?

1.10 Time Values

  • 日历时间(Calendar time) 记录从Epoch:世界标准时间(UTC,Coordinated Universal Time,或者Greenwich Mean Time)1970年1月1号00:00:00开始经过的秒数。用于记录文件修改时间等。用time_t类型表示。
  • 进程时间(Process time) 用于记录进程的CPU时间。用clock_t类型表示。
  • Clock time wall clock time,就是进程从开始到结束这两个时间点的差值;这个时间受系统上有多少进程在跑等因素执行;
  • User CPU time 该进程的用户指令所占用的时间;
  • System CPU time 内核代码代表该进程执行的时间;

所以想要评估程序的性能,应该用User CPU time加上System CPU time来衡量,即所谓的CPU time。可以通过time命令来执行指定程序,获取相应的Clock time、User CPU time和System CPU time。

习题

  1. In Section 1.7, the argument to perror is defined with the ISO C attribute const, where as the integer argument to strerror isn’t defined with this attribute. Why?
    因为perror传的参数是指针,为了避免perror的实现修改该指针指向的内存所以就加上const修饰符;而strerror传的是整数,是值传递,所以不存在这种问题。
  2. If the calendar time is stored as a signed 32-bit integer, in which year will it overflow? How can we extend the overflow point? Are these strategies compatible with existing applications?
    2038年。可以通过将time_t类型换为64位整数来解决这个问题,但是仍然有向后兼容的问题。
  3. If the process time is stored as a signed 32-bit integer, and if the system counts 100 ticksper second, after how many days will the value overflow?
    248天。