《APUE》笔记

来源:互联网 发布:淘宝做ppt20页一般多钱 编辑:程序博客网 时间:2024/04/29 16:24

1. UNIX基础知识

  1. 口令文件/etc/passwd,格式 root:x:0:0:root:/root:/bin/bash,分别表示登录名、加密口令(看到的都是x),用户ID、组ID、注释、起始目录、shell程序。
  2. 常用的Shell程序有Bourne shell(/bin/sh)和Bourne-again shell(/bin/bash)。OS X中的sh是bash的副本。
  3. 在最高层次的根目录中,. 与..都指向当前目录。
  4. ls(1) 这种表示方法表示这个指令在手册的第一部分。
  5. cc是C编译器,在配置gcc的系统中,通常链接至gcc.
  6. main的argc为命令接受参数的个数,argv[]则存储这些参数(argv[0]为程序名称,后面才是参数)。
  7. dirent.h代表的是 Directory Entry.

  8. 文件描述符(file descriptor)通常是一个小的非负整数,如标准输入(0)、标准输出(1)、标准错误(2)。在重定向时,都指向shell。

  9. 重定向:ls < infile.txt >outfile.txt 2>&1 。表示重定向输出和输入,并将标准错误指向标准输出。
  10. 管道是将前者的标准输出转到后者的标准输入。
  11. 大多数系统函数出错时返回-1。
  12. 标准IO函数为不带缓冲的IO函数提供一个带缓冲的接口。如printf, fgets属于标准IO函数。

  13. 程序的执行实例被称为进程(process)。

  14. 大多数进程ID可以用整型表示,用长整型可以提高可移植性。
  15. 3个进程控制的主要函数:fork、exec(存在变体) 和 waitpid。
  16. fork调用一次,返回两次,对父进程返回新的进程ID,对子进程返回0.
  17. Ctrl+D或^D是默认的文件结束符。
  18. 一个进程内的所有线程共享同一地址空间、文件描述符、栈(共享空间,线程有自己的栈地址)以及与进程相关的属性。
  19. 线程ID只在同一进程内起作用。

  20. 函数出错时,通常会设置errno值,errno可以一个包含出错编号的整数,也可以是返回出错编号指针的函数 。

  21. 如果没有出错,不会清除errno的值,并且errno一定不为0.
  22. string.h中的char *strerror(int errnum);返回当前出错信息。
  23. stdio.h中的void perror(const char *msg);按”msg: 出错信息”的格式 输出到标准输出,msg通常传入argv[0]既程序名称。
  24. errono.h中定义的错误分成致命性错误和非致命性错误。

  25. user ID标识不同的用户,ID为0的用户为root或superuser。

  26. group ID主要用为不同组提供不同的权限。
  27. supplementary group ID (附属组),在/etc/group中的第四个字段指定,可以指定多个附属组。增加分组的灵活性,拥有和和附属组中原成员一样的权限。

  28. 中断键Ctrl+C,退出键Ctrl+\ ,会发送对应的信号到线程,可以通过signal注册自定义处理这些信号的函数。

  29. UNIX使用两种时间值,日历时间(time_t)是自协调时所经过的秒数累计值。

  30. 进程时间(clock_t)或者称为CPU时间,以时钟嘀嗒计算。
  31. 进程的运行总时间(wall clock time),与周时运行的进程数有关。本书说到这个时间时,默认没有其他活动。
  32. 用户CPU时间是总时间除去系统服务(read或write等)的时间。
  33. 获取进程的各个时间:”time -p 指令“。

  34. C库函数并不等于系统调用,系统调用提供一种最小接口,库函数提供比较复杂的功能。

  35. 可使用sbrk(一个系统调用)分配一块空间给进程,然后定义分配算法(在用户层次管理这些空间,不使用malloc)。

2. UNIX标准及实现

  1. ANSI是美国国家标准学会,是ISO国际标准化组织的代表美国的成员。
  2. ISO C是为了提供C程序的可移植性,规定了其语法和标准库。
  3. restrict关键字和const修饰常指针一样使用,表示指向的对象在函数中只通过该指针进行访问。
  4. POSIX(可移植操作系统接口)是一个标准,其中分为1003.1和1003.2和SUS,1003.1通常成为POSIX.1, POSIX.1 也吸收了1003.2和SUS的东西。本书相关的是POSIX.1标准。
  5. ISO C将编译时限制列在

3. 文件I/O

  1. 本章说明文件在读写相关的操作。

4. 文件和目录

  1. 本章说明文件和目录相关的操作,如文件类型、目录权限、符号链接、创建时间等相关。

5. 标准I/O库

  1. 详细介绍printf等一系列函数。

6. 系统数据文件和信息

  1. 数据文件是指/et/passwd这样的文件。
  2. 本章说明操作这些文件的各种函数。

7. 进程环境

  1. 内核用exec执行程序时,先用一个特殊的启动例程获得命令行参数和环境量,再调用main函数。
  2. main返回时,启动例程会调用exit。
  3. exit会执行一些标准IO的清理关闭操作和调用atexit注册的函数(调用顺序与注册顺序相反),_exit立即退出并进入内核。
  4. argv[argc]是一个NULL指针。
  5. 环境变量表保存在environ中,使用getenv,putenv访问。
  6. calloc会对新分配的空间初始为0,而malloc不会。
  7. malloc会分配比申请的空间稍大一点的空间,用于存放管理信息。
  8. goto 不跨函数,可使用setjmp和longjmp实现。
  9. 使用getrlimit 和 setrlimit 查询和更改进程的资源限制,如栈大小,可以打开的最大文件数等。

8. 进程控制

  1. fork后获得父进程的副本,包括进程的数据空间、堆和栈、打开的文件描述符等。
  2. fork后子进程和父进程的执行顺序不确定 。
  3. fork用来复制自己和执行一个不同的程序(fork后执行exec)。
  4. exec后放弃当前的进程地址空间而使用了新的地址空间来加载exec需要的可执行文件。
  5. wait 等待一个子进程终止,如果子进程还在运行,则阻塞,waitpid可以设置不阻塞并可制定pid。
  6. 竞争条件:当多个进程都企图对共享数据进行某种处理,而最后结果又取决于进程运行的顺序。
  7. 解释器文件是指首行有#! /bin/sh 这样的文件。
  8. 使用system来执行命令和程序,相比于fork+exec,它进行了各种出错处理和信号处理。
  9. 设置进程的nice值可以改变进程的优先级。

9. 进程关系

  1. 主要讲会话的概念,会话是一个或多个进程组的集合。
  2. 一个其父进程已经终止的进程称为孤儿进程(orphan process),这种进程由init进程收养。
  3. 进程组也可能成为孤儿。

10. 信号

  1. 信号是一种软件中断,提供处理异步事件的方法。信号名以SIG开头。
  2. 系统调用分成低速系统调用和其它,低速调用可使进程永远阻塞,这些调用可以被信号打断,并可以提供自动重启。
  3. 在信号处理程序中保证调用安全的函数,被称为异步安全(async-signal safe)的。其保证可重入,并阻塞会引起不一致信号的发送。
  4. 非异步信号安全函数特点:使用静态数据结构、调用malloc或free、是标准IO函数。

11. 线程

  1. POSIX线程的功能测试宏_POSIX_THREADS。
  2. 线程ID是 pthread_t 类型,只在进程上下文中有意义。
  3. pthread_mutex_timedlock超时后返回错误码。
  4. 读写锁与普通互斥锁的不同之处在于,加锁状态分为读模式和写模式。读模式加锁时,其它线程可以继续加锁。
  5. 条件变量是另一种同步机制, 相似于“事件”的概念, 阻塞等待某事件的发生。
  6. 自旋锁因为会一直忙等状态,适用于锁持有时间短,不希望在调度上花太多成本。
  7. 因为互斥锁有一些优化,自旋锁只有在特殊情况会用到。
  8. “屏障”也是一种同步机制,init时指一个计数,多个线程里wait,只有在执行wait的次数到达init指定的次数时,才会继续执行。可用于分工合作然后将各自的成果进行合并这样的场景。

12. 线程控制

  1. 同样可以使用sysconf获得线程的限制
  2. 在创建线程时,传入pthread_attr_t 来设置线程的属性。几个同步机制也有相关属性设置。
  3. 如果一个函数在相同的时间点可以被 多个线程安全地调 用,则是线程安全的。
  4. 线程安全不一定是异步信号安全,因为异步信号安全除了保证可重入外,还阻塞会引起不一致信号的发送。
0 0
原创粉丝点击