unix 环境高级编程 读书笔记与习题解答第四篇

时间:2021-02-15 06:32:03
第一章 第六节

第一小节

这一章没有程序设计和API方面的深入学习,而是注重介绍了unix操作系统中的原始数据类型和系统原型函数,错误处理方面的知识。

unistd.h 该文件包含了unix操作系统中的各种原始数据类型和原型函数, 我的系统是osx 10.0.5, 该文件通常位于操作系统的 /usr/include 目录下,打开该文件,我们会发现很多预定义信息。

ssize_t	 read(int, void *, size_t) __DARWIN_ALIAS_C(read);
pid_t getpid(void);
ssize_t write(int, const void *, size_t) __DARWIN_ALIAS_C(write);

如上之类的系统原型函数都在该文件中定义,并且为了避免使用依赖于特定计算机的专门数据类型, ssize_t, pid_t, 之类的数据类型,都定义在 sys/ctypes.h 中, 在我的系统中,这些原始数据类型全部定义与:

/usr/include/sys/_types/
-r--r--r-- 1 root wheel 1413 9 19 23:45 _off_t.h
-r--r--r-- 1 root wheel 1537 9 19 23:45 _os_inline.h
-r--r--r-- 1 root wheel 1420 9 19 23:45 _pid_t.h
-r--r--r-- 1 root wheel 1430 9 19 23:45 _posix_vdisable.h
-r--r--r-- 1 root wheel 1458 9 19 23:45 _pthread_attr_t.h
-r--r--r-- 1 root wheel 1455 9 19 23:45 _pthread_cond_t.h

中,_size_t.h 头文件中定义了__ssize_t__的数据类型, 其他的数据类型可以根据文件名判断出来, 在我的系统中 ssize_t 类型被定义为了

#ifndef _SIZE_T
#define _SIZE_T
typedef __darwin_size_t size_t;
#endif /* _SIZE_T */

第二小节

该小节介绍了 ANSI标准中关于 void * 应用, 在非ANSI   标准的C程序当中, 会有使用 char * 来表示通用指针类型,在ANSI中,则全部使用void * , void和void*的讨论可以参考 这篇文章 , 不过我会按照自己的理解说明一下

void* 字面上是空指针,在实际使用的时候可以当作“范型”指针来使用,就是任何指针都可以指向他, 而他进行强制转换运算后, 可以随意使用, 这种情况就很适合 malloc, read, write 这样的函数来使用,因为我们如果不使用void * 就必须为每一种数据类型写一个read, 这里就体现出了范型的好处了, void则是一个语义上的“空” , 经常用来占位, C中,函数不需要参数和返回的时候都需要这样用void来修饰。

第三小节

书中在这里使用一个段落阐述了unix操作系统中的原始数据类型,大多数结尾是 _t 的类型都是内置的原始类型,这些类型根据不同的平台会又不同的值, 所以需要避免程序设计中使用专门数据类型。