C语言库 C标准库 C标准库也叫ISO C库,定义了一组宏、类型和函数,用于输入/输出处理、字符串处理、内存管理、数学计算以及许多与操作系统服务相关的。它们在C标准(如C11标准)中做了规定。内容分布在各个头文件中,比如上面提到的math.h。
POXIS库 首先要理解什么是POSIX。 POSIX全称:可移植操作系统接口。故名思议,由于当时Unix诞生之后,由于各个厂商都实现自己的Unix(都敢使用Unix,由于版权的问题),接口的不统一,导致在各个厂商下基于不同的操作系统开发变得很乱,为了解决这一问题,便有了POSIX标准。
84个头文件 ISO C标准定义的头文件(24项) <assert.h> ---------------------- 验证程序断言 <complex.h> ---------------------- 支持复数算术运算 <ctype.h> ---------------------- 字符类型 <errno.h> ---------------------- 出错码 <fenv.h> ---------------------- 浮点环境 <float.h> ---------------------- 浮点常量 <inttypes.h> ---------------------- 整型格式转换 <iso646.h> ---------------------- 替代关系操作符宏 <limits.h> ---------------------- 实现常量 <locale.h> ---------------------- 局部类别 <math.h> ---------------------- 数学常量 <setjmp.h> ---------------------- 非局部goto <signal.h> ---------------------- 信号 <stdarg.h> ---------------------- 可变参数表 <stdbool.h> ---------------------- 布尔类型和值 <stddef.h> ---------------------- 标准定义 <stdint.h> ---------------------- 整型 <stdio.h> ---------------------- 标准I/O库 <stdlib.h> ---------------------- 实用程序库函数 <string.h> ---------------------- 字符串操作 <tgmath.h> ---------------------- 通用类型数学宏 <time.h> ---------------------- 时间和日期 <wchar.h> ---------------------- 扩展的多字节和宽字符支持 <wctype.h> ---------------------- 宽字符分类和映射支持
POSIX标准定义的必须的头文件(26项) <dirent.h> ---------------------- 目录项 <fcntl.h> ---------------------- 文件控制 <fnmatch.h> ---------------------- 文件名匹配类型 <glob.h> ---------------------- 路径名模式匹配类型 <grp.h> ---------------------- 组文件 <netdb.h> ---------------------- 网络数据库操作 <pwd.h> ---------------------- 口令文件 <regex.h> ---------------------- 正则表达式 <tar.h> ---------------------- tar归档值 <termios.h> ---------------------- 终端I/O <unistd.h> ---------------------- 符号常量 <utime.h> ---------------------- 文件时间 <wordexp.h> ---------------------- 字扩展类型 <arpa/inet.h> ---------------------- Internet定义 <net/if..h> ---------------------- 套接字本地接口 <netinet/in.h> ---------------------- Internet地址族 <netinet/tcp.h>---------------------- 传输控制协议定义 <sys/mman.h>---------------------- 内存管理声明 <sys/select.h>---------------------- select函数 <sys/socket.h>---------------------- 套接字接口 <sys/stat.h> ---------------------- 文件状态 <sys/times.h> ---------------------- 进程时间 <sys/types.h> ---------------------- 基本系统数据类型 <sys/un.h> ---------------------- UNIX域套接字定义 <sys/utsname.h>----------------------系统名 <sys/wait.h> ---------------------- 进程控制
POSIX标准定义的XSI扩展头文件(26项) 列表如下:
<cpio.h> ---------------------- cpio归档值 <dlfcn.h> ---------------------- 动态链接 <fmtmsg.h> ---------------------- 消息显示结构 <ftw.h> ---------------------- 文件树漫游 <iconv.h> ---------------------- 代码集转换实用程序 <langinfo.h> ---------------------- 语言信息常量 <libgen.h> ---------------------- 模式匹配函数定义 <monetary.h> ---------------------- 货币类型 <ndbm.h> ---------------------- 数据库操作 <nl_types.h> ---------------------- 消息类别 <poll.h> ---------------------- 轮询函数 <search.h> ---------------------- 搜索表 <strings.h> ---------------------- 字符串操作 <syslog.h> ---------------------- 系统出错日志记录 <ucontext.h> ---------------------- 用户上下文 <ulimit.h> ---------------------- 用户限制 <utmpx.h> ---------------------- 用户帐户数据库 <sys/ipc.h> ---------------------- IPC <sys/msg.h> ---------------------- 消息队列 <sys/resource.h>------------------- 资源操作 <sys/sem.h> ---------------------- 信号量 <sys/shm.h> ---------------------- 共享存储 <sys/statvfs.h>---------------------- 文件系统信息 <sys/time.h> ---------------------- 时间类型 <sys/timeb.h> ---------------------- 附加的日期和时间定义 <sys/uio.h> ---------------------- 矢量I/O操作
POSIX标准定义的可选头文件(8项) <aio.h> ---------------------- 异步I/O <mqueue.h> ---------------------- 消息队列 <pthread.h> ---------------------- 线程 <sched.h> ---------------------- 执行调度 <semaphore.h>--------------------- 信号量 <spawn.h> ---------------------- 实时spawn接口 <stropts.h> ---------------------- XSI STREAMS接口 <trace.h> ---------------------- 时间跟踪
实现C库 从这部分开始讨论真实的代码。实现标准库的开发者先阅读官方ISO文档需求,然后把它们转成代码。实现时必须依赖特定操作系统提供的功能(读/写文件,分配内存,创建线程等等,通过所谓的系统调用),因此每个平台都要有自己的一套标准库实现。有时它是系统的一个核心部分,有时由另外的组件(编译器)提供,这个必须另外下载。
GNU/Linux的实现 GNU C库即glibc,是GNU项目对C标准库的实现。并不是所有的标准C函数都能在glibc中找到:大部分数学函数其实由libm实现,它是另外的一个库。 目前glibc是Linux上使用最广泛的C库。不过在90年代有个glibc的竞争者叫Linux libc(或者就叫libc),它fork自glibc 1.x。有段时间内,Linux libc是许多Linux发行版的标准C库。 经过多年的开发,glibc被证明远远优于Linux libc,曾经使用libc的Linux发行版都转成使用glibc了。所以要是你的磁盘上有个文件叫libc.so.6请不要惊慌,它是个现代的glibc。版本号涨到6是为了避免与之前Linux libc的版本混淆(不能把它命名成glibc.so.6,因为所有的Linux库命名都必须以lib开头)。 再来看看C++库,实现于libstdc++,或者叫GNU标准C++库。它是个一直持续着的项目,在GNU/Linux上实现了标准C++库。一般常见的Linux发行版默认使用libstdc++。
Mac和iOS的实现 在Mac和iOS上,C标准库的实现是核心库libSystem的一部分,位于/usr/lib/libSystem.dylib。LibSystem还包括了数学库、线程库及其他底层组件。 至于C++标准库,Mac在OS X Mavericks(10.9 版本)前默认使用libstdc++,与现代Linux系操作系统使用相同的。自OS X Mavericks之后,苹果转而使用libc++,它由Mac官方编译器框架LLVM项目实现,用以替代GNU libstdc++标准库。 iOS开发者通过iOS SDK(Software Development Kit)使用标准库。iOS SDK是一组用于创建移动App的工具集。
Windows的实现 Windows上标准库的实现与微软官方编译器Visual Studio严格绑在一起,称为C/C++运行时库(CRT),它包括了标准库的实现。 最初将CRT实现为CRTDLL.DLL库。从Windows 95开始,微软把它实现在MSVCR[版本号].DLL(MSVCR20.DLL, MSVCR70.DLL等)中,猜测也包含了C++标准库。 1997年左右,他们决定把文件名简化为MSVCRT.DLL,这不幸导致了臭名昭著的DLL mess。这也就是为什么从Visual Studio 7.0后又转回每个版本搭载DLLs。 Visual Studio 2015对CRT做了大规模重构,C/C++标准库实现在一个新的库,名为统一C运行时库(Universal CRT or UCRT),编译成UCRTBASE.DLL。 UCRT目前已成为Windows的组件,从Windows 10开始作为操作系统的一部分。
本文参考资料 http://www.cnitblog.com/guopingleee/archive/2007/08/13/31701.html