回顾:
预处理指令 - #include #define 条件编译
#warning #error #pragma
版本控制软件 - cvs vvs
环境变量 - PATH、CPATH、LIBRARY_PATH、LD_LIBRARY_PATH
静态库和共享库 - 主要使用共享库,使用共享库时,编译连接时 加上-l库名,使用时需要配置LD_LIBRARY_PATH。共享库和a.out都存在才能运行代码。
C语言错误处理 - 用返回值处 理。
今天:
C语言提供了错误相关函数和外部全局变量errno,错误由两种数据组成:错误编号和错误信息。errno就是其中的错误编号。调试程序需要借助错误信息。
函数 strerror(int)-传入错误编号,得到信息
perror("附加信息") - 打印错误信息并换行
printf("%m") - 打印错误信息
注:strerror()可以传入错误编号,而perror()和printf()只打印 errno对应的错误信息。
errno发生错误会改变值,不发生错误不改变值。因此,不能用errno判断是否出错,还是用返回值判断是否出错。
errno不是所有函数都使用,具体情况查看man
环境变量和环境表
环境表就是 环境变量的首地址,是一个字符指针数组。每个环境变量就是一个字符串,格式:"PATH=.:/bin:/sbin"。外部全局变量environ就是字符串数组的首地址。 用法:
extern char** environ;
环境表相关函数:
getenv() - 按环境变量名取值
setenv() putenv() - 新增环境变量
unsetenv() clearenv() - 删除环境变量
-----------------------------------------------------------
Unix/Linux 内存管理
程序在运行时,CPU负责运算,内存负责存储数据
内存管理的函数/运算符:
STL - 内存管理是全自动的
|
C++ - new分配内存 delete回收内存
|
C - malloc()分配内存 free()回收
|
Unix系统函数 - sbrk() brk()
|
Unix系统函数 - mmap() munmap() 内存映射/解除用户层
用户层
-----------------------------------------------------------
Unix系统函数(kmalloc/vmalloc) 内核层
-----------------------------------------------------------
程序和进程的概念
程序 - 就是硬盘上的文件,代码编译连接的结果
进程 - 在内存中运行起来的程序(进程)
一个进程的内存的划分:
1.代码区/代码段: 代码(函数)都存在代码区,只读区
2.全局区: 全局变量(初始化的)和static变量
3.BSS段:未初始化的全局变量
全局区和BSS段都是在main()执行之前分配,但BSS段都是在main()执行之前分配,但BSS段自动清0
4.栈区: 非静态的局部变量和函数参数(形参),内存分配和回收 自动管理
5.堆区: 也叫自由区,完全由程序员管理,通常内存泄露就是堆区管理出了问题
6.只读常量区: 字符串字面值“abcde” 和 const的全局变量,只读区,和代码区非常近
Unix/Linux 内存管理机制
Unix/Linux采用虚拟内存地址机制; 每个进程先天都有0-4G的虚拟内存地址,本质就是整数(编号),与物理内存无关,虚拟内存地址不能直接存储数据,否则引发 段错误;虚拟内存地址必须映射到物理内存/硬盘文件后才能存储数据;程序员所接触都是虚拟内存地址;虚拟内存地址分为:用户地址空间和内核地址空间。用户空间0-3G,内核空间3G-4G;用户空间的代码不能直接进入内核空间
内存分配其实就是虚拟地址映射物理内存的过程
内存地址的单位是字节,但内存映射的单位是内存页,一个内存页 4096字节(4k),函数getpagesize可以直接获得内存页的大小
Linux中,几乎一切都有文件与之对应,内存对应文件:/proc/进程ID/maps 文件对应内存中
预处理指令 - #include #define 条件编译
#warning #error #pragma
版本控制软件 - cvs vvs
环境变量 - PATH、CPATH、LIBRARY_PATH、LD_LIBRARY_PATH
静态库和共享库 - 主要使用共享库,使用共享库时,编译连接时 加上-l库名,使用时需要配置LD_LIBRARY_PATH。共享库和a.out都存在才能运行代码。
C语言错误处理 - 用返回值处 理。
今天:
C语言提供了错误相关函数和外部全局变量errno,错误由两种数据组成:错误编号和错误信息。errno就是其中的错误编号。调试程序需要借助错误信息。
函数 strerror(int)-传入错误编号,得到信息
perror("附加信息") - 打印错误信息并换行
printf("%m") - 打印错误信息
注:strerror()可以传入错误编号,而perror()和printf()只打印 errno对应的错误信息。
errno发生错误会改变值,不发生错误不改变值。因此,不能用errno判断是否出错,还是用返回值判断是否出错。
errno不是所有函数都使用,具体情况查看man
环境变量和环境表
环境表就是 环境变量的首地址,是一个字符指针数组。每个环境变量就是一个字符串,格式:"PATH=.:/bin:/sbin"。外部全局变量environ就是字符串数组的首地址。 用法:
extern char** environ;
环境表相关函数:
getenv() - 按环境变量名取值
setenv() putenv() - 新增环境变量
unsetenv() clearenv() - 删除环境变量
-----------------------------------------------------------
Unix/Linux 内存管理
程序在运行时,CPU负责运算,内存负责存储数据
内存管理的函数/运算符:
STL - 内存管理是全自动的
|
C++ - new分配内存 delete回收内存
|
C - malloc()分配内存 free()回收
|
Unix系统函数 - sbrk() brk()
|
Unix系统函数 - mmap() munmap() 内存映射/解除用户层
用户层
-----------------------------------------------------------
Unix系统函数(kmalloc/vmalloc) 内核层
-----------------------------------------------------------
程序和进程的概念
程序 - 就是硬盘上的文件,代码编译连接的结果
进程 - 在内存中运行起来的程序(进程)
一个进程的内存的划分:
1.代码区/代码段: 代码(函数)都存在代码区,只读区
2.全局区: 全局变量(初始化的)和static变量
3.BSS段:未初始化的全局变量
全局区和BSS段都是在main()执行之前分配,但BSS段都是在main()执行之前分配,但BSS段自动清0
4.栈区: 非静态的局部变量和函数参数(形参),内存分配和回收 自动管理
5.堆区: 也叫自由区,完全由程序员管理,通常内存泄露就是堆区管理出了问题
6.只读常量区: 字符串字面值“abcde” 和 const的全局变量,只读区,和代码区非常近
Unix/Linux 内存管理机制
Unix/Linux采用虚拟内存地址机制; 每个进程先天都有0-4G的虚拟内存地址,本质就是整数(编号),与物理内存无关,虚拟内存地址不能直接存储数据,否则引发 段错误;虚拟内存地址必须映射到物理内存/硬盘文件后才能存储数据;程序员所接触都是虚拟内存地址;虚拟内存地址分为:用户地址空间和内核地址空间。用户空间0-3G,内核空间3G-4G;用户空间的代码不能直接进入内核空间
内存分配其实就是虚拟地址映射物理内存的过程
内存地址的单位是字节,但内存映射的单位是内存页,一个内存页 4096字节(4k),函数getpagesize可以直接获得内存页的大小
Linux中,几乎一切都有文件与之对应,内存对应文件:/proc/进程ID/maps 文件对应内存中