Table of Contents
简记
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
- 当Unix系统调用出错时,errno会被设定为相应的值以指示出错原因。为使用errno,需要引入头文件errno.h。
- 如何解读errno的值?查看errno.h,或者
man errno
,或者使用strerror、perror 这两个函数。 - 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
- user ID为0的用户称之为root/superuser;
- /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。
习题
- 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传的是整数,是值传递,所以不存在这种问题。 - 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位整数来解决这个问题,但是仍然有向后兼容的问题。 - 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天。
近期评论