第一章 UNIX基础知识

  1. 内核的接口被称为系统调用
  2. 公用函数库构建在系统调用接口上,应用程序既可以使用公用函数库,也可以使用系统调用;
  3. shell是一个特殊的应用程序,为运行其他应用程序提供了一个接口;
  4. 操作系统 = 内核 + 一些其他软件(系统实用程序、应用程序、shell 和 公用函数);
    1) 实用程序:是针对操作系统的不足而 编制的程序,它帮助用户进一步管理好自己的计 算机;
    2) shell:计算机用来解释你输入的命令然后决定进行何种处理的程序(也可以处理文件);
  5. 用户名和密码的信息都可以在 /etc/passwd 和 /etc/shadow 中找到;
  6. UNIX系统中常见的shell:
    1) Bourne shell
    2) Bourne-again shell
    3) C shell
    4) Kom shell
    5) TENEX shell
  7. 不同的Linux系统使用不同的默认shell;
  8. 目录 是一个包含目录项的文件,目录项是对该目录相关信息的说明;
  9. 在Linux中,“/” 和 “ ”不能出现在文件名中,原因是“/”用来分隔构成路径名的文件名,“ ”用来终止一个路径名;
  10. 创建新目录时会自动创建两个文件名:“.” 和 “…”,“.” 指向当前目录,“…” 指向父目录;
  11. 图1-3相关注释:在这里插入图片描述
    另附👉struct dirent 和 DIR结构体 详解
    另外,如果自己实现书中代码,需要安装 apue.h 库,网上可以搜到教程,这里不再赘述。推荐使用第三版,相对来说需要重新配置的地方比较少。
  12. 每个进程都有一个工作目录,进程可以用 chdir 函数更改其工作目录;
    注:chdir 函数的参数是当前工作目录,返回值为 0 则说明修改成功。
  13. 文件描述符通常是一个小的非负整数,也就是内核打开或创建一个文件时的返回值,我们通过它来对该文件进行读写操作;
  14. 通常,当运行一个新程序时,shell为其打开3个文件描述符 ---- 标准输入、标准输出和标准错误;
  15. 函数 open、read、write、lseek、close 提供了不带缓冲的 I/O,它们都使用文件描述符;
  16. 图1-4相关注释:在这里插入图片描述
  17. 标准 I/O,也就是类似 printf 之类的函数,都提供了缓冲区,我们使用时无需考虑缓冲区大小的问题;
  18. 内核使用 exec 函数将程序读入内存并执行
  19. 进程ID总是一个非负整数;
  20. 使用 getpid() 可以获得当前进程的进程 ID;
  21. 图1-7相关注释:在这里插入图片描述
  22. 进程控制的主要函数:
    1) fork:创建一个新进程,返回值为子进程的进程ID;
    2) exec:exec()族函数用一个新的进程映像替换当前进程映像;
    3) waitpid:暂时停止目前进程的执行,直到有信号来到或子进程结束;
  23. 一个进程内的线程共享这个进程的资源,所以多线程进程需要采取同步措施(比如锁)避免不一致性(比如同时修改数据);
  24. 线程 ID 只在它所属的进程中有意义;
  25. errno 定义在 <errno.h> 中;
  26. 多线程情况下,每个线程都有属于它的局部 errno,以避免互相干扰;
  27. errno 的使用规则:
    1) 如果没有出错,其值不会被例程(例程是某个系统对外提供的功能接口或服务的集合,比如操作系统的API、服务等)清除,因此,仅当函数的返回值指明出错时,才检验其值;
    2) 任何函数都不会将 errno 的值设为 0,而且在 <errno.h> 中定义的所有常量都不为0;
  28. C 标准下的两个用于打印出错信息的函数:
    1) strerror :将 errno 值映射为一个出错消息字符串,并且返回这个字符串的指针;
    2) perror :基于 errno 的当前值,在标准错误上产生一条出错消息,然后返回;
  29. 图1-8 相关注释:在这里插入图片描述
  30. 两种出错:
    1) 致命性的:在用户屏幕上打印出一条出错消息或将一条出错消息写入日志文件,然后退出;
    2)非致命性的:有时可以较为妥善的处理,大多非致命出错是暂时的(如资源短缺)。对于资源相关的非致命性出错的典型恢复操作是延迟一段时间,然后重试;
  31. root 用户的用户 ID 为 0;
  32. 附属组:部分新的 unix 系统版本允许一个用户属于另外一些组;
  33. 终端键盘上有两种产生信号中断当前运行的进程的方法:
    1) 中断键:Delete 或 Ctrl+C
    2) 退出键:Ctrl+\
    另一种产生信号的方式是调用 kill 函数,从一个进程向另一个进程发送信号;
  34. 图1-10新增代码相关注释:在这里插入图片描述
  35. 时间值:
    1) 日历时间:time_t
    2) 进程时间:clock_t
  36. 进程时间值:
    1) 时钟时间:进程运行的时间总量;
    2) 用户CPU时间:执行用户指令所用的时间量;
    3) 系统CPU时间:为该进程执行内核程序所经历的时间;
  37. 系统调用:由操作系统提供的向内核请求服务的程序;
  38. 库函数虽然可能会调用一个或多个内核的系统调用,但它们并不是内核的入口点;
  39. 如果希望的话,我们可以替换库函数,但是系统调用通常是不可以被替换的
  40. 应用程序既可以调用系统调用也可以调用库函数,很多库函数则会调用系统调用;
  41. 系统调用通常提供一种最小接口,而库函数通常提供比较复杂的功能。

课后习题百度文库有参考答案。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值