Apue.2e相关笔记-chapter1&2

毕业前攻克这本基础书吧,虽然不一定做这个,但是这个方向还是很不错的。全书共计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环境没有的实现。

总结一下:先测试当前系统支持那些标准,然后妥善取舍,注意冲突的标准。

posted @ 2013-01-13 17:02  生无所息  阅读(241)  评论(0编辑  收藏  举报