APUE读书笔记(1) 第一章 UNIX基础知识

第一章 UNIX基础知识

一:主要内容
  第一章主要介绍了UNIX体系结构、登录、文件和目录、输入和输出、程序和进程、出错处理、用户标识、信号、时间值、系统调用和函数。

二:UNIX体系结构
  UNIX是一个操作系统,操作系统可以定义为一种软件,控制计算机硬件资源,提供程序运行环境。我们通常叫这种软件为内核。UNIX操作系统包括以下几个部分,由内到外为内核,系统调用,shell,公共函数库,应用程序。
APUE读书笔记(1) 第一章 UNIX基础知识

三:登录
  登录用户信息一般存放在/etc/passwd下,passwd中存放了登录名、加密口令、数字用户ID(uid)、数字组ID(uid)、注释字段、起始目录、shell程序。shell程序是一个命令行解析器,他能读取用户的命令然后执行命令。

四:文件和目录
  UNIX文件系统是目录和文件的一种层次结构,所有文件的起点都是根目录,也叫root目录,这个目录的名称为 “/”
  我理解UNIX文件系统逻辑上呈现一颗树的的结构,这棵树中主要有两种节点,一个是叶子节点一个是非叶子节点,叶子节点都是文件,非叶子节点都是目录。也就是说目录其实是一个包含多个文件的一个节点。
  文件的名字称之为文件名,文件的名字不能包括左斜线和空格,但是一般来说文件名字最好是仅仅由以下几类字符组成的,包括字母、数字、点、短横线和下划线。
  值得注意的是,每个目录在创建的时候就包括了两个文件名 点(.)和点点(两个.),前者指向了目录本身,后者指向了父亲目录;root目录中的.和两个.都指向他自己。
  路径名称分为两种,绝对路径和相对路径,以左斜线为开头的是绝对路径,是从根目录开始查找,如果没有左斜线,从当前路径开始查找。
  比如当前路径为:/a/b 如果我们使用命令cd c/dcd /c/d 其中前者会让我们跳转到目录/a/b/c/d下,后者会让我们跳转到/c/d下
  用户在登入UNIX系统中后一般的起始目录就是他的工作目录,一般的工作目录格式为/usr/用户名字

五:输入和输出
  文件描述符一般是一个小的非负整数,用来标记一个特定进程访问的文件。
  每当运行一个新的程序时,shell都将会为其打开三个文件描述符,标准输入,标准输出,标准错误;如果不做特殊处理的话,这三个描述符都将指向终端。
  不带缓冲的IO有函数open、read、write、lseek、close;带缓冲区的IO也就是标准的IO有函数printf。
六:程序和进程
  程序就是一个可执行文件,内核使用exec函数来执行程序。
  程序执行的实例就是进程,也就是我们熟知的操作系统中的process,每一个进程都会有一个ID来标志,这个ID是一个非负整数。控制进程的函数主要有fork、exec、waitpid。
  通常情况下一个进程只有一个控制线程thread,但是一个进程是可以有多个线程的,而且多个线程也可以充分的利用多处理器系统的并行能力;同一个进程内的多个线程共享同一地址空间、文件描述符、栈以及进程相关的属性
  线程也有对应的ID来表示他们,但是线程的ID仅仅在他的所属进程内起作用
七:出错控制
  当UNIX系统函数出错的时候一般会返回一个负值,如果返回的是指针的函数一般会返回一个NULL指针
  出错分为两类,致命性的和非致命性的;如果是致命性的错误是无法执行回复动作的,如果是非致命性错误,一般可以妥善的处理,而且这种错误往往都是暂时的,比如资源短缺错误;他的典型回复方式就是等待一段时间然后重试。
八:用户标识
  对于登陆在UNIX系统中的用户,一般会有多个,对于每一个用户都会用一个用户ID来标识他,ID为0的用户为超级用户。
  一个用户不仅仅有用户ID(gid)还有组ID(uid)。有的用户还会有附属组ID,一般一个用户最多属于16个其他的组。
九:信号
  信号用于通知进程发生了某种情况,比如当一个进程要执行一个除数为0的除法的时候,就会给这这个进程发送一个浮点异常的信号(下图序号8)。进程有三种方式处理信号:
  1.忽略信号。
  2.按系统默认方式处理,比如浮点异常信号系统的默认处理方式就是终止这个进程。
  3.提供一个函数,信号发生时调用该函数,又被称为捕捉信号。
APUE读书笔记(1) 第一章 UNIX基础知识
十:时间值
  UNIX系统中使用过两种不同的时间值:
  1.日历时间,该值是自1970年1月1日00:00:00以来国际标准时间(UTC)所经过的秒数累计值(早期的手册称UTC为格林尼治标准时间)。这些时间值用于记录文件最近一次的修改时间等。
  2.进程时间
  这也被称为CPU时间,用以度量进程使用的*处理机资源。进程时间以时钟滴答计算,历史上曾经去每秒钟为50、60或100个滴答。
  系统基本数据类型clock_t用于保存这种时间值。可以使用sysconf函数得到每秒时钟滴答数。
  当度量一个进程的执行时间时,UNIX系统使用三个进程时间值:
  (1)时钟时间。
  (2)用户CPU时间。
  (3)系统CPU时间。
  有趣的是,在32位的操作系统中,日历时间所能记录的最大值转换为年是2038年,不过64位的操作系统中就不存在这个问题了。
十一:系统调用和库函数
  所有操作系统都提供多种服务的入口点,程序由此向内核请求服务。各种版本的UNIX实现都提供定义明确、数量有限、可直接进入内核的入口点,这些入口点被称为系统调用。系统调用实质上就是保存在内核中的函数。
  UNIX所使用的技术是将每一个系统调用在标准的C库中设置一个具有同样名字的函数,所以库函数中包括了所有的系统调用,但库函数中的函数并不都是系统调用。
  从实现者的角度观察,系统调用和库函数之间有重大的区别;但从用户角度来看,其区别并不非常重要。系统调用和库函数都以C函数的形式出现,两者都为应用程序提供服务。但是,我们应当理解,必要时我们可以替换库函数,而通常却不能替换系统调用。
  应用程序可以调用系统调用或者库函数,而很多库函数则会调用系统调用。
  系统调用和库函数之间的另一个差别是:系统调用通常提供一种最小接口,而库函数通常提供比较复杂的功能。