使用linux c编写一个demo,能够生成1000个随机大小为1K到50M的so文件,并调用这些so

news/2025/2/12 15:05:23/文章来源:https://www.cnblogs.com/mmc9527/p/18711600

下面是一个完整的 Linux C 程序示例,它能够生成 1000 个随机大小(1K 到 50M)的共享库文件(.so 文件),并调用这些共享库中的函数。


1. 生成共享库的代码

generate_so.c

这个程序用于生成 1000 个共享库文件,每个共享库包含一个简单的函数。

c
复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>// 生成随机大小的文件
void generate_random_file(const char *filename, size_t size) {int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);if (fd == -1) {perror("open");exit(EXIT_FAILURE);}char *buffer = malloc(size);if (!buffer) {perror("malloc");close(fd);exit(EXIT_FAILURE);}for (size_t i = 0; i < size; i++) {buffer[i] = rand() % 256;}if (write(fd, buffer, size) != size) {perror("write");free(buffer);close(fd);exit(EXIT_FAILURE);}free(buffer);close(fd);
}// 生成共享库文件
void generate_shared_library(const char *filename) {char command[512];snprintf(command, sizeof(command),"gcc -shared -fPIC -o %s -x c - <<EOF\n""#include <stdio.h>\n""void hello() {\n""    printf(\"Hello from %s!\\n\");\n""}\n""EOF",filename, filename);system(command);
}int main() {srand(time(NULL));for (int i = 0; i < 1000; i++) {char so_filename[256];snprintf(so_filename, sizeof(so_filename), "lib%d.so", i);// 生成随机大小(1K - 50M)size_t size = (rand() % (50 * 1024 * 1024 - 1 * 1024)) + 1 * 1024;// 生成共享库文件generate_shared_library(so_filename);// 填充随机数据generate_random_file(so_filename, size);printf("Generated %s with size %zu bytes\n", so_filename, size);}return 0;
}

2. 调用共享库的代码

load_so.c

这个程序用于加载生成的共享库并调用其中的函数。

c
复制
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>int main() {for (int i = 0; i < 1000; i++) {char so_filename[256];snprintf(so_filename, sizeof(so_filename), "./lib%d.so", i);// 动态加载共享库void *handle = dlopen(so_filename, RTLD_LAZY);if (!handle) {fprintf(stderr, "Error loading %s: %s\n", so_filename, dlerror());continue;}// 获取函数指针void (*hello)() = dlsym(handle, "hello");if (!hello) {fprintf(stderr, "Error finding symbol in %s: %s\n", so_filename, dlerror());dlclose(handle);continue;}// 调用函数hello();// 关闭共享库dlclose(handle);}return 0;
}

3. 编译和运行

编译生成共享库的程序

bash
复制
gcc -o generate_so generate_so.c

运行生成共享库的程序

bash
复制
./generate_so

这将生成 1000 个共享库文件,文件名分别为 lib0.solib1.so, ..., lib999.so

编译调用共享库的程序

bash
复制
gcc -o load_so load_so.c -ldl

运行调用共享库的程序

bash
复制
./load_so

4. 代码说明

  1. 生成共享库

    • generate_so.c 使用 gcc 动态生成共享库文件。

    • 每个共享库包含一个简单的 hello 函数,打印一条消息。

    • 共享库文件的大小随机生成,范围为 1K 到 50M。

  2. 调用共享库

    • load_so.c 使用 dlopen 动态加载共享库。

    • 使用 dlsym 获取共享库中的 hello 函数并调用。

  3. 随机大小

    • 共享库的大小通过随机数生成,范围为 1K 到 50M。

  4. 动态加载

    • 使用 dlopen 和 dlsym 动态加载共享库并调用函数。


5. 注意事项

  1. 文件大小

    • 生成的共享库文件会占用磁盘空间,请确保磁盘有足够的空间(最大约 50GB)。

  2. 共享库内容

    • 生成的共享库包含一个简单的 hello 函数。如果需要更复杂的功能,可以修改 generate_shared_library 函数。

  3. 错误处理

    • 如果共享库加载失败或函数未找到,程序会打印错误信息并继续运行。

  4. 性能

    • 生成和加载 1000 个共享库可能会消耗较多时间和资源,建议在性能较好的机器上运行。


6. 示例输出

生成共享库的输出

 
复制
Generated lib0.so with size 1048576 bytes
Generated lib1.so with size 5242880 bytes
...
Generated lib999.so with size 3145728 bytes

调用共享库的输出

 
复制
Hello from lib0.so!
Hello from lib1.so!
...
Hello from lib999.so!

通过以上步骤,你可以生成 1000 个随机大小的共享库文件,并动态加载和调用这些共享库中的函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/882577.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

车辆电子档案系统

在高阶自动驾驶场景和MaaS(Mobility as a Service)业务中,自动驾驶车辆的状态直接关系到整体运营的安全和效率。因此,拥有一套多维度预测、分析车辆指标的电子档案系统显得尤为重要。经纬恒润研发的车辆电子档案是汇总整车各类数据详细信息、对车辆上各项指标进行分析预测及…

九. 计算机网络

计算机网络 一. 硬件设备层级 设备物理层设备 中继器、集线器(是一种多端口的中继器)数据链路层设备 网桥、交换机(是一种多端口的网桥)网络层设备 路由器应用层设备 网关集线器不能自动寻址、集线器可以检测发送冲突。物理层不能隔离广播域和冲突域(也就是所有的端口都是…

2025年,如何选择IT监控平台

在数字化时代,IT系统已经成为企业运营的核心支撑。为了确保IT系统的稳定运行和高效管理,选择一款合适的IT监控平台至关重要。 一、IT监控平台的主要类型 IT监控平台根据其功能和应用场景的不同,可以大致分为以下几类:综合型IT监控平台:这类平台提供了全面的IT监控解决方案…

土木与地质工程监测 振弦式测缝计 桥梁、隧道、边坡位移实时监控,定制化组网与无线传输支持

土木与地质工程监测 振弦式测缝计 桥梁、隧道、边坡位移实时监控,定制化组网与无线传输支持基于霍尔效应原理研发的高精度绝对角度传感器,采用创新性数字信号处理技术实现角度测量。核心系统集成高精度16位模数转换器,配合五阶数字滤波算法,有效保障测量数据稳定性。通过温…

vue3 + vite + element-plus + springboot打包上线所遇之坑

自我本经介绍:我自己是做Java开发的,对于前端其实并不熟悉,以下的前端技术都是为了做这个项目现学现卖的。 自己使用vue3 + vite + element-plus从头到尾打了个管理后台,在开发环境运行一切正常,于是准备打包发布到服务器上,就有了几天痛苦的解决问题的过程打包npm run b…

省选前想题记录

想题记录 wtcqwq 2.3~2.6 Todo List 除了省选计划题单、模拟赛补题和刷 AGC 以外。LGV 引理和线性代数; USACO Jan 的 G 和 P 组想一想学一学做一做。随记 2.4。只有刺痛自己的时候才能认知自我啊... 2.4。好冷。机房里已经空无一人了。真希望确实是 “高处不胜寒” 啊。 2.5。…

在KEIL中使用JLINK仿真HC32F448时不能识别芯片

1.HC32F448在MDK中使用JLINK仿真找到不芯片2.确定后手动选择芯片 如下图,选择Cortex-M4就可以了。

基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。

这是一座专属你的知识宝库,它依托 DeepSeek R1 满血版大模型构建而成。在这里,每一次回答都源自对你专属文件的深度学习,精准匹配你的知识需求,为你输出最贴合文件内容的答案 。 使用 Cherry Studio 结合硅基流动(SiliconCloud)来创建基于 DeepSeek R1 的个人知识库,按照…

十分钟满血deepseek R1 api部署

目前deepseek app访问速度较慢,经常出现访问超时的问题。而使用api部署的方式即可使用满血专属deepseek R1模型,pc端/手机端均可使用 简要流程:注册硅基流动账号,生成账号密钥下载chat bot,配置chat bot进行对话注册硅基流动账号 硅基流动网址如下: https://cloud.silico…

2024问题总结

20241225 XlVirtualList解决数据量大,滚动后,再点下拉会出现空白 setTimeout(() => {document.querySelector(.vxe-table--body).style.marginTop = 0})20241224双向数据绑定问题加key 是否已有这个元素 $set 慢半拍加$nextTick:key="isPlan?scope.row.dblamount:null…

WPF 中设置Trigger改变button背景色不起效的问题

通过触发器,改变button背景色的方法是在Templete中. 正确的方法是先创建Style,再在Style中修改Templete,在ControlTemplete中定义触发器: 精雕细琢,精益求精。

vxe-table 使用树结构点击筛选,子节点筛选

vxe-table 使用树结构点击筛选,子节点筛选,启用树结构后会同时对每个层级的子节点进行筛选 官网:https://vxetable.cn 效果<template><div><vxe-grid v-bind="gridOptions"></vxe-grid></div> </template><script setup&g…