Unix高级编程--第一章 Unix基础知识

第一章 Unix基础知识

  1. 所有操作系统都向他们运行的程序提供服务。典型的服务有执行新程序、打开文件、读取文件、分配存储区、获得当前时间等等。
  2. 口令文件中的登录项由7个冒号分隔的字段组成:登录名、加密口令、数字用户ID(224)、数字组ID(20)、注释字段、起始目录(/home/stevens)以及shell程序(/bin/bash),很多比较新的系统已经将加密口令移到拎一个文件中。
  3. shell是一个命令行解释器
  4. UNix文件系统是目录和文件的一种层次安排,目录的起点被称为根(root),其名字是字符(/)。
  5. 文件属性是:文件类型、文件长度、文件所有者、文件的许可权(例如其他用户是否能访问该文件)、文件最后的修改时间等等
  6. 目录中的各个名字成为文件名,不能出现在文件名中的字符只有两个,斜线(/)和空操作符(null),斜线分隔构成路径名的各文件名,空操作符则终止一个路径名。
  7. 当创建一个新目录时,自动创建两个文件名: .(点)  和  ..(点点)
  8. 某些Unix文件系统限制文件名的最长长度为14个字符,BSD版本则将这种限制扩展到255个字符
  9. 以斜线开头的路径名成为绝对路径名,否则成为相对路径名
  10. 当程序结束的时候,可以使用exit作为退出,exit的参数如果是0则是正常退出程序;如果参数值是1~255则表示出错
  11. 每个进程都有一个工作目录,有时会成为当前工作目录,所有相对路径名都从工作目录开始解释,进程可以用chdir函数更改工作目录。
  12. 登录时,工作目录设置为起始目录,该其实目录从口令文件中的登录项中取得
  13. 文件描述符是一个小的非负整数,内核用以标识一个特定进程正在存访的文件。当内核打开一个现存文件或者创建一个新文件时,他就返回一个文件描述符。当读写文件时,就可以使用它
  14. 每当运行一个新程序时,所有的shell都为其打开三个文件描述符:标准输入、标准输出、以及标准出错。
  15. 函数open/read/write/lseek/close提供了不用缓存的I/O,这些函数使用文件描述符进行工作。
  16. 两个常用STDIN_FILENO和STDOUT_FILENO定义在头文件中,它指定了标准输入和标准输出的文件描述符。他们的典型值是0,1.
  17. 标准I/O函数提供一种对不用缓存的I/O函数的带缓存的界面。
  18. 程序时存放在磁盘文件中的可执行文件。使用6个exec函数中的一个由内核将程序读入存储器,并使其执行。
  19. 程序的执行实例被称为进程,每个Unix进程都一定有一个唯一的数字标识符,称为进程ID,进程ID总是一个非负整数。getid()可以得到进程的ID
  20. 有三个用于进程控制的主要函数:fork/exec/waitpid
  21. 调用fork创建一个新进程。新进程是调用进程的复制品,故称调用进程为父进程,新创建的进程为子进程。fork对父进程返回新子进程的非负进程ID,对子进程则返回0.因为fork创建一新进程,所以它被调用一次(由父进程),但返回两次(在附近城中和紫禁城中)
  22. 头文件包含了许多UNIX系统服务的函数原型,函数原型是ANSI C标准的组成部分,比如read/write/getpid
  23. 像write函数: ssize_t write(int, const void*, size_t)若使用费ANSI编译程序,或没有给出函数原型,则需写成:write(fd, (void*)data, sizeof(data))
  24. 以_t结尾的这些数据类型被称为原始系统数据类型。他们通常在头文件中定义(头文件已经包含该头文件)
  25. 文件中定义了变量errno以及可以赋值得各种常数,这些常数都以E开头;对于errno应当知道的两条规则:第一就是如果没有出错,则其值不会被一个例程清除,因此,仅当函数的返回值指明出错时,才检验其值。第二是任一函数都不会讲errno值设置为0,在中定义的所有常数都不为0.C语言定义了两个函数,帮助打印出错信息:strerror(), perror(const void *msg)
  26. 口令文件登录项中的用户ID是一个数值,它向系统标识各种不同的用户,系统管理员在确定一个用户的登录名的同时,确定其用户ID,用户不能更改其用户ID。通常每个用户有一个唯一的用户ID。用户ID为0的用户为根用户或者超级用户。
  27. 口令围巾啊登录项也包括用户的组ID,他也是一个数值。组ID也是由系统管理员在确定用户登录名时分配的。组文件将组名映射为一个数字组ID,它通常是/etc/group。除了在口令文件中对一个登录名指定一个组ID外,某些UNIX版本还允许一个用户属于另外一些组。
  28. 信号是通知进程已发生某种条件的一种技术。进程如何处理信号有三种选择:第一忽略该信号,有些信号表示硬件异常,比如除以0或者访问进程地址空间以外的单元。第二按系统默认方式处理。对于0除,系统的默认方式是终止进程。第三提供一个函数,信号发生时则调用这个函数使用这种方式,我们将能指导什么时候发生信号,并按照所希望的方式处理他。当一个进程发送信号时,我们必须是该进程的所有者
  29. 始终时间又称为墙上时钟时间。它是进程运行的时间总量,其值与系统中同时运行的进程数有关。在我们报告时钟时间时,都是在系统中没有其他活动时进行度量的。用户CPU时间是执行用户指令所用的时间量。系统CPU时间是为该进程执行内核所经历的时间。例如,只要一个进程执行一个系统服务,例如read/write,则在内核内执行该服务所花费的时间就计入该进程的系统CPU时间。用户CPU时间和系统CPU时间的和通常被称为CPU时间。
  30. 所有操作系统都提供多种服务(类似read/write函数?)的入口点,由此程序向内核请求服务。各种版本的UNIX都提供经良好定义的有限数目的入口点,经过这些入口点进入内核,这些入口点被称为系统调用。系统调用时不能更改的一种UNIX特征。UNIX所使用的技术是为每个系统调用在标准C库中设置一个具有童谣名字的函数,用户进程用标准C程序序列来调用这些函数,然后和拿书又使用系统所要求的的技术电泳相应的内核服务。例如函数可将一个或者多个C参数送入通用寄存器,然后执行某个产生软终端进入内核的机器指令。从应用角度可将系统调用视为C函数;例如printf函数可能会嗲用write系统调用用以进行输出操作
  31. 从执行者的角度来看,系统调用和库函数之间有重大区别,但从用户角度来看,其区别不重要。
  32. 以系统调用malloc函数为例
    Unix高级编程--第一章 Unix基础知识_第1张图片
    UNIX系统调用中处理存储器分配的是sbrk,他不是一个通用的存储管理器,它增加或者减少指定字节数的进程地址空间。如果管理该地址空间却取决于进程。malloc函数实现一种特定类型的分配。上图表示了应用程序、malloc函数以及sbrk系统调用之间的关系。内核中的系统调用分配另外一块空间给进程,而库函数malloc函数则管理这一空间。应用程序可以调用系统调用或者库函数,而很多库函数则会调用系统调用。
    Unix高级编程--第一章 Unix基础知识_第2张图片
    上图显示C库函数和系统调用之间的差别
  33.  

你可能感兴趣的:(linux)