c语言动态库,c语言动态库和静态库

dfnjsfkhak 37 0

大家好,今天小编关注到一个比较意思的话题,就是关于c语言动态库的问题,于是小编就整理了4个相关介绍c语言动态库的解答,让我们一起看看吧。

  1. C语言动态数据区是什么?
  2. c语言如何实现动态替换动态库so文件后,主程序自动加载更新?
  3. 用C语言写的函数弄成DLL动态链接库,要怎么做?

C语言动态数据区是什么

c语言中的动态数据存储主要有两大类:

一类是栈(STACK)内存区域,另一类是堆(HEAP)内存区域。他们都是在程序运行过程中动态分配的。其大小在程序运行的过程中将动态地变化。

c语言动态库,c语言动态库和静态库-第1张图片-芜湖力博教育咨询公司
图片来源网络,侵删)

在目前常见的体系结构编译系统中,一种典型的动态内存管理形式为:栈内存将从高地址向地地址分配,堆内存将从地地址向高地址分配。

从内存管理实现的角度上,堆内存使用链表来实现,而栈内存使用线性存储的方式。栈内存是由编译器管理的,而堆内存是由程序调用具体库函数管理的。

c语言如何实现动态替换动态库so文件后,主程序自动加载更新?

粗略地看,要实现动态库的热升级,需要注意4个点(以Linux为例,其他系统类似):

c语言动态库,c语言动态库和静态库-第2张图片-芜湖力博教育咨询公司
(图片来源网络,侵删)
  1. so文件不依赖ldd加载(也就是主程序的ELF不要跟so文件动态链接,这一点可以通过修改链接的命令行实现),而是自己在启动时主动调用dlopen/dlclose/g_module_open/g_module_close这类函数加载和卸载so文件。
  2. 主程序使用inotify等监听so文件的修改***。
  3. so文件导出热更新相关的2个操作,比如可以叫做s***e_and_stop,restore_and_resume。
    s***e_and_stop需要把运行时的状态进行序列化,放在内存或者文件固定位置,比如一个文件中,然后停止操作(重点是不要再改状态)。restore_and_resume从这个位置把状态读回来(反序列化),然后继续运行它的功能
  4. 主程序发现so文件改动以后,调用s***e_and_stop,然后unload动态库,然后load新的动态库,然后调用restore_and_resume。根据具体业务不同,这个最好是程序流程中的一个原子操作,比如flush或者suspend一些队列,暂停处理输入(主循环暂停,相关worker线程暂停)。

你的so库是无状态的就更容易了,可以省去序列化反序列化的过程。但是一定要做好***的同步,主程序不要在卸载和加载的中间状态执行依赖于动态库的操作。

用C语言写的函数弄成DLL动态链接库,要怎么做?

编写动态链接库的过程

其实和编写普通C程序差不多少

c语言动态库,c语言动态库和静态库-第3张图片-芜湖力博教育咨询公司
(图片来源网络,侵删)

只不过

把一个整体的C程序,摘出来一部分,放在独立的一个或者几个C文件中

再把这些C文件打包成dll或者so文件而已。

所以写法上没有特别的

需要注意的是编译。

如果是windows,最好用IDE,创建的时候选动态链接库

如果是gcc,那么编译的时候增加编译选项-fPIC-shared即可。

c语言中形参的存储单元是动态分配的?

因为数组在使用的时候可能造成内存浪费,使用动态内存分配可以解决这个问题。C函数库提供两个函数,malloc和free,分别用于执行动态内存分配和释放。malloc的参数就是需要分配的内存字节数。malloc分配一块连续的内存。如果操作系统无法向malloc提供更多的内存,malloc就返回一个NULL指针

到此,以上就是小编对于c语言动态库的问题就介绍到这了,希望介绍关于c语言动态库的4点解答对大家有用

标签: 动态 内存 文件