第一章
1.2 UNIX体系结构
内核的接口被称为系统调用(system call)。
公用函数库构建在系统调用接口之上,应用软件既可使用公用函数库,也可使用系统调用。
1.3 登录
用户登录系统时输入登录名和口令,系统在其口令文件(通常/etc/passwd)中查看登录名。口令文件登录项由7个以冒号分隔的字段组成。
shell是一个命令行解释器,它读取用户输入,然后执行命令。
常见shell有:
Bourne shell(/bin/sh)
Bourne-again shell(/bin/bash):GNU shell,所有Linux系统都提供
C shell(/bin/csh):所有BSD版本都提供
Korn shell(/bin/ksh)
TENEX C shell(/bin/tcsh):C shell的加强版
1.4 文件和目录
UNIX文件系统是目录和文件组成的一种层次结构,目录起点为根(/)。
目录是一个包含许多目录项的文件,在逻辑上可以认为每个目录项都包含一个文件名,同时还包含说明该文件属性的信息。
stat和fstat函数返回包含所有文件属性的一个信息结构。
不能出现在文件名中的字符只有斜线(/)和空操作符(null)两个。前者用来分隔构成路径名的各文件名,后者用来终止一个路径名。
创建新目录时会自动创建两个文件名:.(当前目录)和..(父目录)。
每个进程都有一个工作目录。所有相对路径名都从工作目录开始解释。进程可用chdir函数更改工作目录。
登录时,工作目录设置为起始目录(home directory),该起始目录从口令文件中相应用户的登录项中取得。
1.5 输入和输出
文件描述符(file descriptor)通常是一个小的非负整数,内核用它标识一个特定进程正在访问的文件。
每当运行一个新程序时,所有的shell都为其打开三个文件描述符:标准输入、标准输出以及标准出错。
函数open、read、write、lseek以及close提供了不用缓冲的I/O。这些函数都使用文件描述符。
常量STDIN_FILENO和STDOUT_FILENO定义在<unistd.h>头文件中,指定了标准输入和标准输出的文件描述符,典型值为0和1。
标准I/O函数提供一种对不用缓冲I/O函数的带缓冲的接口,使用时无需担心如何选取最佳缓冲区大小。
1.6 程序和进程
进程ID(process ID)是每个进程唯一的数字标识符,总是一非负整数。
有三个用于进程控制的主要函数:fork、exec和waitpid。(exec函数有六种变体)
在一个进程内的所有线程共享同一地址空间、文件描述符、栈以及与进程相关的属性。
线程也有ID标识,但是线程ID只在它所属进程内起作用。
1.7 出错处理
当UNIX函数出错时,常常返回一个负值,而且整型变量errno通常被设置为含有附加信息的一个值。
文件<errno.h>中定义了符号errno以及可以赋予它的各种常量,这些常量都以E开头。
对于errno的两条规则:1.仅当函数的返回值指明出错时才检验其值 2.任一函数都不会将errno值设置为0。
C标准定义了strerror和perror两个函数帮助打印出错信息。
1.8 用户标识
用户不能更改其用户ID,通常每个用户有一个唯一的用户ID。
用户ID为0的用户为根(root)或超级用户(superuser)。
组被用于将若干用户分到不同的项目或部门中去。
组文件将组名映射为数字组ID,通常为/etc/group。
对于磁盘上的每个文件,文件系统都存放该文件所有者的用户ID和组ID。
除了在口令文件中对一个登录名指定一个组ID外,大多数UNIX系统还允许一个用户属于另外的组。
1.9 信号
信号(signal)是通知进程已发生某种情况的一种技术。
进程处理信号有三种选择:1.忽略该信号 2.按系统默认方式处理 3.提供一个函数,信号发生时则调用该函数,这被称为捕捉该信号。
终端键盘上有两种产生信号的方法,分别为中断键(interrupt key,通常是Delete键或Ctrl+C)和退出键(quit key,通常是Ctrl+\)。
另一种产生信号的方法是调用名为kill的函数。
1.10 时间值
UNIX有两种不同的时间值:
1.日历时间。该值是自1970年1月1日00:00:00以来国际标准时间(UTC)所经过的秒数累计值。
系统基本数据类型time_t用于保存这种时间值。
2.进程时间。也被称为CPU时间,以时钟滴答计算。
系统基本数据类型clock_t用于保存这种时间值。sysconf函数可得到每秒时钟滴答数。
用户CPU时间是执行用户指令所用的时间。
系统CPU时间是为该进程执行内核程序所经历的时间。
用户时间和系统CPU时间之和常被称为CPU时间。
1.11 系统调用和库函数
UNIX为每个系统调用在标准C库中设置一个具有同样名字的函数。
应用程序可以调用系统调用或者库函数,而很多库函数则会调用系统调用。
1.2 UNIX体系结构
内核的接口被称为系统调用(system call)。
公用函数库构建在系统调用接口之上,应用软件既可使用公用函数库,也可使用系统调用。
1.3 登录
用户登录系统时输入登录名和口令,系统在其口令文件(通常/etc/passwd)中查看登录名。口令文件登录项由7个以冒号分隔的字段组成。
shell是一个命令行解释器,它读取用户输入,然后执行命令。
常见shell有:
Bourne shell(/bin/sh)
Bourne-again shell(/bin/bash):GNU shell,所有Linux系统都提供
C shell(/bin/csh):所有BSD版本都提供
Korn shell(/bin/ksh)
TENEX C shell(/bin/tcsh):C shell的加强版
1.4 文件和目录
UNIX文件系统是目录和文件组成的一种层次结构,目录起点为根(/)。
目录是一个包含许多目录项的文件,在逻辑上可以认为每个目录项都包含一个文件名,同时还包含说明该文件属性的信息。
stat和fstat函数返回包含所有文件属性的一个信息结构。
不能出现在文件名中的字符只有斜线(/)和空操作符(null)两个。前者用来分隔构成路径名的各文件名,后者用来终止一个路径名。
创建新目录时会自动创建两个文件名:.(当前目录)和..(父目录)。
每个进程都有一个工作目录。所有相对路径名都从工作目录开始解释。进程可用chdir函数更改工作目录。
登录时,工作目录设置为起始目录(home directory),该起始目录从口令文件中相应用户的登录项中取得。
1.5 输入和输出
文件描述符(file descriptor)通常是一个小的非负整数,内核用它标识一个特定进程正在访问的文件。
每当运行一个新程序时,所有的shell都为其打开三个文件描述符:标准输入、标准输出以及标准出错。
函数open、read、write、lseek以及close提供了不用缓冲的I/O。这些函数都使用文件描述符。
常量STDIN_FILENO和STDOUT_FILENO定义在<unistd.h>头文件中,指定了标准输入和标准输出的文件描述符,典型值为0和1。
标准I/O函数提供一种对不用缓冲I/O函数的带缓冲的接口,使用时无需担心如何选取最佳缓冲区大小。
1.6 程序和进程
进程ID(process ID)是每个进程唯一的数字标识符,总是一非负整数。
有三个用于进程控制的主要函数:fork、exec和waitpid。(exec函数有六种变体)
在一个进程内的所有线程共享同一地址空间、文件描述符、栈以及与进程相关的属性。
线程也有ID标识,但是线程ID只在它所属进程内起作用。
1.7 出错处理
当UNIX函数出错时,常常返回一个负值,而且整型变量errno通常被设置为含有附加信息的一个值。
文件<errno.h>中定义了符号errno以及可以赋予它的各种常量,这些常量都以E开头。
对于errno的两条规则:1.仅当函数的返回值指明出错时才检验其值 2.任一函数都不会将errno值设置为0。
C标准定义了strerror和perror两个函数帮助打印出错信息。
1.8 用户标识
用户不能更改其用户ID,通常每个用户有一个唯一的用户ID。
用户ID为0的用户为根(root)或超级用户(superuser)。
组被用于将若干用户分到不同的项目或部门中去。
组文件将组名映射为数字组ID,通常为/etc/group。
对于磁盘上的每个文件,文件系统都存放该文件所有者的用户ID和组ID。
除了在口令文件中对一个登录名指定一个组ID外,大多数UNIX系统还允许一个用户属于另外的组。
1.9 信号
信号(signal)是通知进程已发生某种情况的一种技术。
进程处理信号有三种选择:1.忽略该信号 2.按系统默认方式处理 3.提供一个函数,信号发生时则调用该函数,这被称为捕捉该信号。
终端键盘上有两种产生信号的方法,分别为中断键(interrupt key,通常是Delete键或Ctrl+C)和退出键(quit key,通常是Ctrl+\)。
另一种产生信号的方法是调用名为kill的函数。
1.10 时间值
UNIX有两种不同的时间值:
1.日历时间。该值是自1970年1月1日00:00:00以来国际标准时间(UTC)所经过的秒数累计值。
系统基本数据类型time_t用于保存这种时间值。
2.进程时间。也被称为CPU时间,以时钟滴答计算。
系统基本数据类型clock_t用于保存这种时间值。sysconf函数可得到每秒时钟滴答数。
用户CPU时间是执行用户指令所用的时间。
系统CPU时间是为该进程执行内核程序所经历的时间。
用户时间和系统CPU时间之和常被称为CPU时间。
1.11 系统调用和库函数
UNIX为每个系统调用在标准C库中设置一个具有同样名字的函数。
应用程序可以调用系统调用或者库函数,而很多库函数则会调用系统调用。