《APUE》笔记
来源:互联网 发布:淘宝做ppt20页一般多钱 编辑:程序博客网 时间:2024/04/29 16:24
1. UNIX基础知识
- 口令文件/etc/passwd,格式 root:x:0:0:root:/root:/bin/bash,分别表示登录名、加密口令(看到的都是x),用户ID、组ID、注释、起始目录、shell程序。
- 常用的Shell程序有Bourne shell(/bin/sh)和Bourne-again shell(/bin/bash)。OS X中的sh是bash的副本。
- 在最高层次的根目录中,. 与..都指向当前目录。
- ls(1) 这种表示方法表示这个指令在手册的第一部分。
- cc是C编译器,在配置gcc的系统中,通常链接至gcc.
- main的argc为命令接受参数的个数,argv[]则存储这些参数(argv[0]为程序名称,后面才是参数)。
dirent.h代表的是 Directory Entry.
文件描述符(file descriptor)通常是一个小的非负整数,如标准输入(0)、标准输出(1)、标准错误(2)。在重定向时,都指向shell。
- 重定向:ls < infile.txt >outfile.txt 2>&1 。表示重定向输出和输入,并将标准错误指向标准输出。
- 管道是将前者的标准输出转到后者的标准输入。
- 大多数系统函数出错时返回-1。
标准IO函数为不带缓冲的IO函数提供一个带缓冲的接口。如printf, fgets属于标准IO函数。
程序的执行实例被称为进程(process)。
- 大多数进程ID可以用整型表示,用长整型可以提高可移植性。
- 3个进程控制的主要函数:fork、exec(存在变体) 和 waitpid。
- fork调用一次,返回两次,对父进程返回新的进程ID,对子进程返回0.
- Ctrl+D或^D是默认的文件结束符。
- 一个进程内的所有线程共享同一地址空间、文件描述符、栈(共享空间,线程有自己的栈地址)以及与进程相关的属性。
线程ID只在同一进程内起作用。
函数出错时,通常会设置errno值,errno可以一个包含出错编号的整数,也可以是返回出错编号指针的函数 。
- 如果没有出错,不会清除errno的值,并且errno一定不为0.
- string.h中的char *strerror(int errnum);返回当前出错信息。
- stdio.h中的void perror(const char *msg);按”msg: 出错信息”的格式 输出到标准输出,msg通常传入argv[0]既程序名称。
errono.h中定义的错误分成致命性错误和非致命性错误。
user ID标识不同的用户,ID为0的用户为root或superuser。
- group ID主要用为不同组提供不同的权限。
supplementary group ID (附属组),在/etc/group中的第四个字段指定,可以指定多个附属组。增加分组的灵活性,拥有和和附属组中原成员一样的权限。
中断键Ctrl+C,退出键Ctrl+\ ,会发送对应的信号到线程,可以通过signal注册自定义处理这些信号的函数。
UNIX使用两种时间值,日历时间(time_t)是自协调时所经过的秒数累计值。
- 进程时间(clock_t)或者称为CPU时间,以时钟嘀嗒计算。
- 进程的运行总时间(wall clock time),与周时运行的进程数有关。本书说到这个时间时,默认没有其他活动。
- 用户CPU时间是总时间除去系统服务(read或write等)的时间。
获取进程的各个时间:”time -p 指令“。
C库函数并不等于系统调用,系统调用提供一种最小接口,库函数提供比较复杂的功能。
- 可使用sbrk(一个系统调用)分配一块空间给进程,然后定义分配算法(在用户层次管理这些空间,不使用malloc)。
2. UNIX标准及实现
- ANSI是美国国家标准学会,是ISO国际标准化组织的代表美国的成员。
- ISO C是为了提供C程序的可移植性,规定了其语法和标准库。
- restrict关键字和const修饰常指针一样使用,表示指向的对象在函数中只通过该指针进行访问。
- POSIX(可移植操作系统接口)是一个标准,其中分为1003.1和1003.2和SUS,1003.1通常成为POSIX.1, POSIX.1 也吸收了1003.2和SUS的东西。本书相关的是POSIX.1标准。
- ISO C将编译时限制列在
3. 文件I/O
- 本章说明文件在读写相关的操作。
4. 文件和目录
- 本章说明文件和目录相关的操作,如文件类型、目录权限、符号链接、创建时间等相关。
5. 标准I/O库
- 详细介绍printf等一系列函数。
6. 系统数据文件和信息
- 数据文件是指/et/passwd这样的文件。
- 本章说明操作这些文件的各种函数。
7. 进程环境
- 内核用exec执行程序时,先用一个特殊的启动例程获得命令行参数和环境量,再调用main函数。
- main返回时,启动例程会调用exit。
- exit会执行一些标准IO的清理关闭操作和调用atexit注册的函数(调用顺序与注册顺序相反),_exit立即退出并进入内核。
- argv[argc]是一个NULL指针。
- 环境变量表保存在environ中,使用getenv,putenv访问。
- calloc会对新分配的空间初始为0,而malloc不会。
- malloc会分配比申请的空间稍大一点的空间,用于存放管理信息。
- goto 不跨函数,可使用setjmp和longjmp实现。
- 使用getrlimit 和 setrlimit 查询和更改进程的资源限制,如栈大小,可以打开的最大文件数等。
8. 进程控制
- fork后获得父进程的副本,包括进程的数据空间、堆和栈、打开的文件描述符等。
- fork后子进程和父进程的执行顺序不确定 。
- fork用来复制自己和执行一个不同的程序(fork后执行exec)。
- exec后放弃当前的进程地址空间而使用了新的地址空间来加载exec需要的可执行文件。
- wait 等待一个子进程终止,如果子进程还在运行,则阻塞,waitpid可以设置不阻塞并可制定pid。
- 竞争条件:当多个进程都企图对共享数据进行某种处理,而最后结果又取决于进程运行的顺序。
- 解释器文件是指首行有#! /bin/sh 这样的文件。
- 使用system来执行命令和程序,相比于fork+exec,它进行了各种出错处理和信号处理。
- 设置进程的nice值可以改变进程的优先级。
9. 进程关系
- 主要讲会话的概念,会话是一个或多个进程组的集合。
- 一个其父进程已经终止的进程称为孤儿进程(orphan process),这种进程由init进程收养。
- 进程组也可能成为孤儿。
10. 信号
- 信号是一种软件中断,提供处理异步事件的方法。信号名以SIG开头。
- 系统调用分成低速系统调用和其它,低速调用可使进程永远阻塞,这些调用可以被信号打断,并可以提供自动重启。
- 在信号处理程序中保证调用安全的函数,被称为异步安全(async-signal safe)的。其保证可重入,并阻塞会引起不一致信号的发送。
- 非异步信号安全函数特点:使用静态数据结构、调用malloc或free、是标准IO函数。
11. 线程
- POSIX线程的功能测试宏_POSIX_THREADS。
- 线程ID是 pthread_t 类型,只在进程上下文中有意义。
- pthread_mutex_timedlock超时后返回错误码。
- 读写锁与普通互斥锁的不同之处在于,加锁状态分为读模式和写模式。读模式加锁时,其它线程可以继续加锁。
- 条件变量是另一种同步机制, 相似于“事件”的概念, 阻塞等待某事件的发生。
- 自旋锁因为会一直忙等状态,适用于锁持有时间短,不希望在调度上花太多成本。
- 因为互斥锁有一些优化,自旋锁只有在特殊情况会用到。
- “屏障”也是一种同步机制,init时指一个计数,多个线程里wait,只有在执行wait的次数到达init指定的次数时,才会继续执行。可用于分工合作然后将各自的成果进行合并这样的场景。
12. 线程控制
- 同样可以使用sysconf获得线程的限制
- 在创建线程时,传入pthread_attr_t 来设置线程的属性。几个同步机制也有相关属性设置。
- 如果一个函数在相同的时间点可以被 多个线程安全地调 用,则是线程安全的。
- 线程安全不一定是异步信号安全,因为异步信号安全除了保证可重入外,还阻塞会引起不一致信号的发送。
0 0
- apue-笔记
- 《APUE》笔记
- APUE 笔记
- APUE学习笔记:APUE运行环境
- APUE 信号学习笔记
- APUE学习笔记00
- APUE学习笔记
- apue 笔记 10.15
- APUE 笔记 sigsuspend
- APUE 笔记 守护进程
- APUE函数笔记: 附录
- APUE第一章笔记
- APUE笔记-0说明
- apue 第二章笔记
- APUE笔记一
- APUE笔记二
- APUE笔记三
- APUE笔记四
- c++第五次上机实验-奇偶分离
- linux cpufreq framework(3)_cpufreq core
- 银行卡验证代码交流
- 【NoSql】redis安装&部署
- vs2013无法加载项目文件
- 《APUE》笔记
- MarshalAs的使用
- 跌跌跌,只能自嘲一下
- noexcept异常说明及其使用
- 第11章 Android的线程和线程池
- QT加载qt的DLL错误
- linux cpufreq framework(4)_cpufreq governor
- c++第五次上机作业
- Android Action