day04错误处理、环境表、内存管理技术

来源:互联网 发布:linux 重启apache命令 编辑:程序博客网 时间:2024/06/08 16:09

    • 本节内容
    • C语言中的错误处理
      • 1 错误信息对错误编号的翻译
        • 1strerror函数
        • 2perror函数重中之重
        • 3printf函数了解
    • 环境表的概念和使用
      • 1 基本概念
      • 2常用的基本操作函数
        • 1getenv函数
        • 2setenv函数
        • 3unsetenv函数
        • 4putenv函数
        • 5clearenv函数
      • 3 main 函数的原型了解
    • 内存管理技术
      • 1 程序和进程的概念
      • 2 进程中的内存区域划分
        • 1代码区Text
        • 2只读常量区Text
        • 3全局区数据区Data
        • 4BSS段Data
        • 5堆区Heap

本节内容:

(1)c语言中的错误处理
(2)环境表的概念和使用
(3)内存管理技术


1. C语言中的错误处理

1.1 错误信息(对错误编号的翻译)

(1)strerror函数

#include <string.h>char *strerror(int errnum);函数功能:主要用于将参数指定的错误编号翻译成对应的错误信息并返回出来;

(2)perror函数(重中之重)

#include <stdio.h>void perror(const char *s);函数功能:主要用于打印调用系统/库函数期间所产生的最后一个错误信息,如果参数不为空, 则原样打印,后面跟一个冒号,一个空格,具体的错误信息,以及自动换行;

(3)printf函数(了解)

printf("%m"); - 打印错误信息

注意:

  • 切记不能直接使用errno作为判断函数是否出错的依据;
  • 判断函数是否出错依赖于函数的具体的返回值;
  • 只有确定函数已经出错了的情况下,可以考虑用errno来获取具体的错误原因;


2.环境表的概念和使用

2.1 基本概念

  •   环境表本质上就是环境变量的集合,每个进程都拥有一个独立的环境表,用于记录与当前进程相关的环境信息;
  •   环境表是一个以空指针为结尾的字符指针数组,其中每个指针指向一个格式为“变量名=变量值”的字符串,该字符指针数组的起始地址保存在全局变量char** environ 中,因此可以通过全局变量类访问整个环境变量;

2.2常用的基本操作函数

(1)getenv函数

#include <stdlib.h>char *getenv(const char *name);函数功能:    主要用于获取参数指定环境变量名所对应的环境变量值,如果该环境变量不存在,则返回NULL;

(2)setenv函数

#include <stdlib.h>int setenv(const char *name, const char *value, int overwrite);第一个参数:字符串形式的环境变量名第二个参数:字符串形式的环境变量值第三个参数:是否修改的标志非0 - 则表示允许修改已经存在的环境变量值  0 - 则表示不允许修改已经存在的环境变量值返回值:成功返回0,失败返回1,并设置errno表示错误的原因;函数功能:    主要用于增加/修改一个环境变量;    如果环境变量name存在,则增加环境变量;如果环境变量name不存在,则是否修改取决于第三个参数。

(3)unsetenv函数

int unsetenv(const char *name);intiunsetenv(const char *name);函数功能:    主要用于删除参数指定的环境变量,若该环境变量不存在,则该函数调用还是成功的,只是环境变量表不会发生改变;

(4)putenv函数

#include <stdlib.h>int putenv(char *string);函数功能:    主要用于增加或者/修改参数指定的环境变量,其中参数的格式为:name=value;成功返回0,不成功返回非0;

(5)clearenv函数

#include <stdlib.h>int clearenv(void);函数功能:    主要功能用于清空环境表中所欲的环境变量对,将全局便量environ也置为空指针,成功返回0,失败返回非0;

2.3 main 函数的原型(了解)

int main(int argc, char* argv[], char* envp[])第一个参数:用于记录命令行参数的个数;第二个参数:字符指针数组,用于记录每个命令行参数的地址;第三个参数:字符指针数组,用于记录环境表信息如:a.out 张三 李四argc = 3;argv[0] = a.out;argv[1] = "张三";argv[2] = "李四";

注意:

  由于历史因素等,造成main函数的第三个参数不一定被所有系统支持,因此建议用全局变量environ来访问整个环境变量表;



3.内存管理技术

3.1 程序和进程的概念

  • 程序 - 存放在磁盘/硬盘上的可执行文件;
  • 进程 - 运行在内存中的程序叫做进程;
  • 同一个程序可以同时对应多个进程;

3.2 进程中的内存区域划分

如:int num;     //全局变量,默认初始值为0 BSS段int main(viod){    int num; //局部变量,默认初始值为随机数   栈区    return0;}

(1)代码区(Text)

  • 主要用于存放具体的功能代码,函数指针指向该区域;
  • 如可执行指令;

(2)只读常量区(Text)

  • 主要用于常量字符串,字面值常量,具有常属性并且已经被初始化的全局变量和静态局部变量;
    如:“” 10 const
    const int i = 20;
    static const int i = 20;

(3)全局区/数据区(Data)

  • 主要用于存放不具有常属性但已经被初始化的全局变量和静态局部变量;

(4)BSS段(Data)

  • 主要用于存放不具有常属性也没有被初始化的全局变量和静态局部变量;
  • 该区域还在main函数之前自动清零;

(5)堆区(Heap)

  • 主要指使用malloc/calloc/realloc()/free()操作的区域

(6)栈区(Stack)

  • 主要存放非静态的局部变量;
  • 该区域由操作系统自动管理;

总结:

  • 进程在内存空间中的布局按照从小到大依次为:代码区、只读常量区、全局区/数据区、BSS段、堆区、栈区;
  • 一般来说,堆区中的内存地址从小到大依次分配,而栈区的内存地址从大到小依次分配;

练习:

  自定义两个函数分别打印空心菱形和实心菱形,放在同一个.c文件中,将该.c文件分别打包成金泰库和共享库,编写main.c文件进行调用