UC学习day04 动态加载 程序中的错误处理 内存管理

本文深入探讨了动态加载的概念及其实现方式,包括dlopen、dlclose等API的使用,以及如何通过动态链接器按需加载共享库。同时,文章还讲解了程序中的错误处理机制和内存管理的基本原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 动态加载
什么是动态加载.按需加载.程序在执行的时候,需要使用到动态库里的函数的时候,程序调用动态链接器提供的API,请求动态链接器将需要的动态库加载到内存.
dlopen(3) dlclose(3) dlerror(3) dlsysm(3)

#include <dlfcn.h>
void *dlopen(const char *filename, int flags);
功能:打开一个共享库文件
参数:
filename:指定了动态库文件的名字
flags:
RTLD_LAZY 代码使用到这个库函数的时候,才解析了
RTLD_NOW 立即加载 函数返回前已经被解析了
返回值:
NULL 函数调用失败
not NULL 函数调用成功
如果出现错误 可以使用dlerror(3)获取诊断信息

int dlclose(void *handle);
功能:加载的动态库的引用计数减1.如果引用计数减到0,从系统中移除这个动态库
参数:
handle dlopen(3)的返回值
返回值:
成功 0
错误 非0
如果出现错误 可以使用dlerror(3)获取诊断信息
Link with -ldl.

举例说明 动态加载库函数 libpmath.so
代码参见 dynamic.c

#include <dlfcn.h>
char *dlerror(void);
功能:获取动态链接器的API的错误信息
参数:
返回值:
NULL 代表没有错误信息
返回一个字符串的首地址.这个字符串描述了最近一次调用动态链接器的API

#include <dlfcn.h>
void *dlsym(void *handle, const char *symbol);
功能:获取一个符号的地址(函数的名字 全局变量的名字 静态的局部变量的名字)
参数:
handle:指定共享对象的地址.dlopen(3)的返回值
symbol:指定具体的函数的名字
返回值:
成功 返回函数的入口地址
失败 NULL 可以使用dlerror(3)获取错误信息

二 程序中的错误处理
系统维护着一个全局变量,整型的.
errno.库函数和系统调用产生错误的时候,会设置这个变量值.错误码.
#include <errno.h>
需要 根据错误的编号,找到描述错误的原因.
举例说明 文件的操作 代码参见 file.c

strerror(3)
#include <string.h>
char *strerror(int errnum);
功能:获取错误编号对应的错误描述信息
参数:
errnum:错误的编号.就是获取这个错误编号对应的错误描述信息
返回值:
返回一个字符串的首地址.描述错误编号的信息
找不到错误编号,返回"Unknown error nnn"

perror(3)
#include <stdio.h>
void perror(const char *s);
功能:输出一条错误消息
参数:
s:用户指定的字符串
返回值:

标准输入 FILE *stdin 键盘
标准输出 FILE *stdout 显示器
标准错误输出 FILE *stderr 显示器

三 内存管理
什么是内存?
ROM RAM

CS DS SS ES

虚拟地址 物理地址
页 页表 页框 4k
代码区域 数据区域 栈区域
代码段 数据段 栈段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值