基础概念——C标准、C运行库和glibc

摘要:
值得注意的是,像线程操作这样的功能并不是标准的C语言运行库的一部分,但是glibc和MSVCRT都包含了线程操作的库函数。

C标准:
C 标准主要由两部分组成,一部分描述C的语法,另一部分描述C标准库(描述了一些C标准函数的原型,但是不提供实现)。
C标准库定义了一组标准头文件,每个头文件中包含一些相关的函数、变量、类型声明和宏定义。

常见的C标准就是ANSI C;美国国家标准协会;
为了提高C语言的开发效率,C标准定义了一系列常用的函数,称为C标准库函数。
应用程序开发者可以包含这些标准函数的头文件,来调用这些C标准函数,来开发应用,这样就可以屏蔽平台的差异;



C运行库:
C标准库函数的实现留给了各个系统平台;
这个实现就是C运行时库(C Run Time Libray) ,简称CRT
C运行库,是和平台相关的,即和操作系统相关的;
C运行库(CRT)从某种程度上来讲是C语言的程序和不同操作系统平台之间的抽象层;//接口是统一的标准,实现由各个平台自己实现;
Linux和Windows平台下的两个主要C语言运行库分别为
glibc(GNU C Library)和MSVCRT(Microsoft Visual C Run-time)。

值得注意的是,像线程操作这样的功能并不是标准的C语言运行库的一部分,
但是glibc和MSVCRT都包含了线程操作的库函数。所以glibc和MSVCRT事实上是标准C语言运行库的超集,
它们各自对C标准库进行了一些扩展。
也就是说CRT实际上包含两部分,一部分实现是基于C标准库来的,一部分实现是根据平台自身开发的库
某种程度上是C运行库是C标准库的一个扩展库,加了很多C标准库所没有的与平台相关的或者不相关的库接口函数。

要在一个平台上支持C语言,不仅要实现符合平台的C编译器,还要实现C标准库,这样的实现才算符合C标准。



glibc:
这里以linux系统为例进行讨论;在Linux平台上最广泛使用的C运行库是glibc,其中包括C标准库的实现,也包括所有系统函数。
几乎所有C程序都要调用glibc的库函数,所以glibc是Linux平台C程序运行的基础。
GNU C:GNU C实际上是GNU C库,又称为glibc,即c运行库;

最基本、最常用的C标准库函数和系统函数libc.so库文件中,几乎所有C程序的运行都依赖于libc.so
有些做数学计算的C程序依赖于libm.so
多线程的C程序依赖于libpthread.so
libc有时时专指libc.so这个库文件,而说glibc时指的是glibc提供的所有库文件

值得注意的是,像线程操作这样的功能并不是C标准库的一部分(也就是说C标准没有定义线程操作相关的函数原型)
但是glibc和MSVCRT(Windows系统下的C运行库)都包含了线程操作的库函数。
比如glibc有一个可选的pthread库中的pthread_create()函数可以用来创建线程;
而MSVCRT中可以使用_beginthread()函数来创建线程。
所以glibc和MSVCRT事实上是标准C语言运行库的超集它们各自对C标准库进行了一些扩展

glibc的发布版本主要由两部分组成,一部分是头文件,比如stdio.h、stdlib.h等,它们往往位于/usr/include;
另外一部分则是库的二进制文件部分。二进制部分主要的就是C语言标准库,它有静态和动态两个版本。
动态的标准库我们及在本书的前面章节中碰到过了,它位于/lib/libc.so.6;而静态标准库位于/usr/lib/libc.a。

事实上glibc除了C标准库之外,还有几个辅助程序运行的运行库,这几个文件可以称得上是真正的“运行库”。
它们就是/usr/lib/crt1.o、/usr/lib/crti.o和/usr/lib/crtn.o。

比如我们可以在不同的操作系统平台下使用fread来读取文件,
而事实上fread在不同的操作系统平台下的实现是不同的,
但作为运行库的使用者我们不需要关心这一点。
虽然各个平台下的C语言运行库提供了很多功能,但很多时候它们毕竟有限,
比如用户的权限控制、操作系统线程创建等都不是属于标准的C语言运行库。
于是我们不得不通过其他的办法,诸如绕过C语言运行库直接调用操作系统API或使用其他的库。



这里讲讲GNUGCC:
GNU软件包列表:该系统的基本组成包括GNU编译器套装(GCC)、GNU的C库(glibc)、以及GNU核心工具组(coreutils)、(GDB)。

GCC原名GNU C Compiler,后来逐渐支持更多的语言编译(C++、Fortran、Pascal、Objective-C、Java、Ada、Go等),
所以变成了GNU Compiler Collection(GNU编译器套装

免责声明:文章转载自《基础概念——C标准、C运行库和glibc》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Drozer渗透测试工具(使用篇)uirecorder的安装和使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android SurfaceView

一、SurfaceView简介SurfaceView可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。什么是Surface在这里要先说说什么是Surface。简单的说Surface对应了一块屏幕缓冲...

网络通信框架Apache MINA

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的TCP/UDP 应用程序开发、串口通讯程序。Mina 的应用层:一个...

锁和监视器之间的区别 – Java并发

在面试中你可能遇到过这样的问题:锁(lock)和监视器(monitor)有什么区别? 嗯,要回答这个问题,你必须深入理解Java的多线程底层是如何工作的。 简短的答案是,锁为实现监视器提供必要的支持。详细答案如下。 锁(lock) 逻辑上锁是对象内存堆中头部的一部分数据。JVM中的每个对象都有一个锁(或互斥锁),任何程序都可以使用它来协调对对象的多线程访问...

mysql主从之多线程复制

多线程复制 mysql 主从复制原理: 1. master 节点上的binlogdump 线程,在slave 与其正常连接的情况下,将binlog 发送到slave 上。 2. slave 节点的I/O Thread ,通过读取master 节点binlog 日志名称以及偏移量信息将其拷贝到本地relay log 日志文件。 3. slave 节点的SQL...

HBase源码分析之WAL

WAL(Write-Ahead Logging)是数据库系统中保障原子性和持久性的技术,通过使用WAL可以将数据的随机写入变为顺序写入,可以提高数据写入的性能。在hbase中写入数据时,会将数据写入内存同时写wal日志,为防止日志丢失,日志是写在hdfs上的。 默认是每个RegionServer有1个WAL,在HBase1.0开始支持多个WALHBASE-...

简单的多线程通信实例(用委托事件实现)

 1using System; 2using System.Threading; 3 4namespace ifan 5{ 6    //自定义委托声明 7    public delegate void childExitDelegate(object sender, ChildExitEventArgs e); 8 9    public class...