读书笔记-程序员的自我修养(十)

运行库

  • 入口函数和程序初始化

    • 普及:操作系统装载程序之后,首先运行的代码并不是 main 的第一行,而是 某些别的代码,这写代码负责准备好 main 函数执行所需要的环境,并且负责调用 main 函数,我们称这写代码为 入口函数入口点(Entry Point)

    • 程序初始化:Main函数之前有个入口函数

    1. 操作系统在创建进程后,把控制权交到了程序的入口,这个入口往往是运行库中的某个入口函数

    2. 入口函数对运行库和程序运行环境进行初始化,包括堆、I/O、线程、全局变量构造等

    3. 入口函数在完成初始化之后,调用 main 函数,正式开始执行程序主体部分

    4. main 函数执行完毕以后,返回到入口函数,入口函数进行清理工作,然后进行系统调用结束进程

    • 入口函数示例

      • GLIBC(Linux):__start -> __libc_start_main -> exit -> _exit,即在 __libc_start_main 执行之前,做了参数压入栈,寄存器初始化,全局变量赋值等操作

      • MSVC CRT(Windows):初始化和 OS 版本有关的全局变量,初始化堆初始化 I/O,获取命令行参数和环境变量,初始化C库的一些数据,调用 main 并记录返回值,检查错误并将 main 的返回值返回

        • 初始化:mainCRTStartup –> heap_init() –> HeapCreate 方法

        • I/O 初始化:建立 打开文件表,如果能够继承自父进程,那么从父进程 获取 继承的句柄,初始化 标准输入输出

  • 运行库与 I/O

    • 对于程序来说,I/O 涵盖的范围还要广一些,一个程序的 I/O 指代了程序与外界的交互,包括文件、管道、网络、命令行、信号等

    • I/O 初始化函数需要在用户空间中建立 stdin、stdout、stderr 及其 对应的 FILE 结构,是的程序进入 main 之后可以直接使用 printf,scanf 等函数

  • C++运行库

    • 普及:任何一个 C 程序,它的背后都有一套庞大的代码来进行支撑,以使得该程序能够正常运行。这套代码至少包括入口函数,及其所以来的函数所构成的函数集合,当然,他还理应包括各种标砖函数的实现,我们称之为 运行时库(Runtime Library),亦或 C运行库(CRT)

    • CRT大致包含了如下功能

      • 启动与退出:包括入口函数及入口函数所依赖的其他函数等

      • 标准函数:由C语言标准规定的 C语言标准库 所拥有的函数实现

      • I/O:I/O功能的封装和实现

      • :堆的封装和实现

      • 语言实现:语言中一些特殊功能的实现

      • 调试:实现调试功能的代码

    • C语言标准库由 24 个 C头文件 组成:标准输入输出(stdio.h),文件操作(stdio.h),字符操作(ctype.h),字符串操作(string.h),数学函数(math.h),资源管理(stdlib.h),格式转换(stdlib.h),时间/日期(time.h),断言(assert.h),各种类型上的常熟(limits.h & float.h),变长参数(stdarg.h),非局部跳转(setjump.h

    • 运行库是和平台(操作系统)强相关 的,提供了不同操作系统平台的底层抽象,Linux 和 Window 平台下的两个主要 C 语言运行库分别为: glibc (GNC C Library)MSVCRT(Microsoft Visual C Run-time)

  • 运行库与多线程

    • Window API :CreateThread() 和 ExitThread()

    • MSVCRT:_beginThread() / _beginthreadex 和 _endthread()

    • Glibc:pthread_create() 和 pthread_exit()

如需转载,请注明出处