毕业前攻克这本基础书吧,虽然不一定做这个,但是这个方向还是很不错的。全书共计21章,这里主要记录要点和自己做的习题解答。
编译环境是debian6.0.6+xfce4,用的ide是codeblocks 12.11(刚发布,手感不错,可惜不支持fakevim)
Chapter1是综述,各方面的常识提示。
工作目录:使用chdir函数更改,默认为~,从passwd文件中用户的登陆项中取得。
I/O相关:
File descriptor,类似于win中的文件句柄
非缓冲I/O:open, read, write, lseek和close
程序和进程:
进程控制:fork, exec和waitpid
Fork创建新进程,在父进程中返回pid,在子程序中返回0;用exec函数制定新程序文件。父进程可以使用waitpid等待子进程终止。
线程:
线程只有独立的栈,线程ID作用于进程内部
错误处理:
一般函数错误都是返回负值,指针类对应NULL。一些宏常量表示错误,常以E开头(如EACCS表示权限不足)
errno是一个可修改的整形左值,使用了本地线程存储技术,在不同线程里面指向不同的对象,注意任意函数都不会讲errno设置为0
帮助打印出错信息的函数:strerror(int errno),返回错误码对应的错误信息;
perror(char *msg),打印错误信息。
用户标识:
用户ID:getuid()
组id:getgid()
附加组:用户可以属于多个不同的组
信号:
参见ISO C里面的signal.h
时间值:
UTC:日历时间,使用time_t保存
进程时间:以时钟滴答为单位,使用clock_t保存,使用sysconf取得相关信息。
进程时间包括:wall clock time,进程运行的时间总量;用户CPU时间(执行用户指令)和系统CPU时间(执行内核程序);后两者合称为CPU时间。
使用time函数获得具体值。
system call和library functions:
Linux大约有240~260个系统内核入口,一般做法是在库函数中设置与系统调用具有同样名称的一组函数。注意系统调用与库函数之间的差别,简单来说,程序通过库函数来调用系统调用,系统调用一般不可更改,函数可以根据自己的需要随便修改。系统调用一般功能唯一,尽量精简的接口数量符合设计规范。
ISO C90,共计15个头文件,C99是24个,C11是29个,目前流行的版本仍然是C90,C99有少量使用。根据C++11的发展,C99的应用应该会有所发展(当然在win下不太可能)
POSIX:可移植操作系统接口,在大部分常见的操作系统中被支持的接口(win从win8开始取消了这一子系统),最新版本是POSIX.1 2008,本书使用了POSIX.1 2001标准。标准规定了必须的和可选的头文件,所有符合标准的符号常量前缀为_POSIX
XSI(X/Open System Interface)是由Single Unix Specification规定的一个POSIX.1的超集,其对应的符号常量是_XOPEN_UNIX,注意只有符合该接口规定的系统才能成为UNIX。这些接口依据常见的功能被分为若干选项组,包括:
- 加密:由_XOPEN_CRYPE标记
- 实时:由_XOPEN_REALTIME标记
- 高级实时
- 实时线程:由_XOPEN_REALTIME_THREADS标记
- 高级实时线程
- 跟踪
- 流:由_XOPEN_STREAMS标记
- 遗留接口:由_XOPEN_LEGACY标记
标准的最新版也是2008版,本书使用了2004版。
限制:各类宏(<limits.h>)和POSIX限制,如果使用POSIX限制,可以保证良好的可移植性,但是可能不能满足使用要求。去除_POSIX前缀可以得到实际的实现值,有些值可能依赖于运行环境,必须进行实时测试,可以使用三个conf函数(sysconf, pathconf和fpathconf取得)。最后还有一个类别:标准规定不确定的常数。
这三个函数存在于头文件<unistd.h>中,后两种的区别是前者使用路径名,后者使用文件描述符作为第一个参数。共同的参数是name字段,前缀分别是_SC, _PC。返回值:long类型,如果参数不存在就返回-1(同时设置errno),如果是变量的值,返回-1就表示不确定。
确定标准的支持情况:
检查该符号常量是否定义,如果定义且值为-1,表明不支持该选项;大于0,支持;=0,必须使用三个函数之一进行运行时确定。
如果只使用POSIX通用常量值,只需要定义_POSIX_C_SOURCE
基本系统数据类型:定义在types.h中
标准之间的冲突:
ISO C和POSIX.1中的某些定义有差别,如clock(ISO C)返回clock_t 类型的CPU时间,除以<time.h>中定义的CLOCKS_PER_SEC,就可以得到以秒为单位的时间;而times(POSIX.1)却与sysconf对应,特别需要注意这些"用同一种数据类型保存不同值"的情况;还有一种情况是POSIX.1需要定义一些C环境没有的实现。
总结一下:先测试当前系统支持那些标准,然后妥善取舍,注意冲突的标准。