1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
| #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <dlfcn.h> #include <sys/utsname.h>
/** * 库版本信息结构 */ typedef struct { char name[64]; char version[32]; char filepath[256]; void *handle; int is_loaded; unsigned long load_time; } library_version_t;
/** * 版本管理器 */ typedef struct { library_version_t libraries[16]; int library_count; int max_libraries; } version_manager_t;
/** * 初始化版本管理器 */ int init_version_manager(version_manager_t *manager) { memset(manager, 0, sizeof(version_manager_t)); manager->max_libraries = 16; manager->library_count = 0; printf("版本管理器初始化完成\n"); printf("最大库数量: %d\n", manager->max_libraries); return 0; }
/** * 添加库版本信息 */ int add_library_version(version_manager_t *manager, const char *name, const char *version, const char *filepath) { if (manager->library_count >= manager->max_libraries) { printf("库数量已达上限\n"); return -1; } library_version_t *lib = &manager->libraries[manager->library_count]; strncpy(lib->name, name, sizeof(lib->name) - 1); lib->name[sizeof(lib->name) - 1] = '\0'; strncpy(lib->version, version, sizeof(lib->version) - 1); lib->version[sizeof(lib->version) - 1] = '\0'; strncpy(lib->filepath, filepath, sizeof(lib->filepath) - 1); lib->filepath[sizeof(lib->filepath) - 1] = '\0'; lib->handle = NULL; lib->is_loaded = 0; lib->load_time = 0; manager->library_count++; printf("添加库版本信息:\n"); printf(" 名称: %s\n", lib->name); printf(" 版本: %s\n", lib->version); printf(" 路径: %s\n", lib->filepath); return 0; }
/** * 显示系统库信息 */ void show_system_library_info() { printf("=== 系统库信息 ===\n"); // 显示系统信息 struct utsname sys_info; if (uname(&sys_info) == 0) { printf("系统名称: %s\n", sys_info.sysname); printf("节点名称: %s\n", sys_info.nodename); printf("发行版本: %s\n", sys_info.release); printf("系统版本: %s\n", sys_info.version); printf("硬件架构: %s\n", sys_info.machine); } // 显示常见系统库 printf("\n常见系统库路径:\n"); const char *common_lib_paths[] = { "/lib/x86_64-linux-gnu/libc.so.6", "/lib/x86_64-linux-gnu/libm.so.6", "/lib/x86_64-linux-gnu/libdl.so.2", "/lib/x86_64-linux-gnu/librt.so.1", "/lib/x86_64-linux-gnu/libpthread.so.0", NULL }; for (int i = 0; common_lib_paths[i]; i++) { struct stat st; if (stat(common_lib_paths[i], &st) == 0) { printf(" %s (存在)\n", common_lib_paths[i]); } else { printf(" %s (不存在)\n", common_lib_paths[i]); } } }
/** * 演示版本管理 */ int demo_version_management() { version_manager_t manager; printf("=== 动态库版本管理演示 ===\n"); // 初始化版本管理器 printf("1. 初始化版本管理器:\n"); if (init_version_manager(&manager) != 0) { return -1; } // 显示系统信息 printf("\n2. 系统库信息:\n"); show_system_library_info(); // 添加库版本信息 printf("\n3. 添加库版本信息:\n"); add_library_version(&manager, "libc", "2.31", "/lib/x86_64-linux-gnu/libc.so.6"); add_library_version(&manager, "libm", "2.31", "/lib/x86_64-linux-gnu/libm.so.6"); add_library_version(&manager, "libdl", "2.31", "/lib/x86_64-linux-gnu/libdl.so.2"); add_library_version(&manager, "librt", "2.31", "/lib/x86_64-linux-gnu/librt.so.1"); add_library_version(&manager, "libpthread", "2.31", "/lib/x86_64-linux-gnu/libpthread.so.0"); // 显示所有库信息 printf("\n4. 所有库版本信息:\n"); printf("%-15s %-10s %-40s %-10s\n", "名称", "版本", "路径", "状态"); printf("%-15s %-10s %-40s %-10s\n", "----", "----", "----", "----"); for (int i = 0; i < manager.library_count; i++) { library_version_t *lib = &manager.libraries[i]; printf("%-15s %-10s %-40s %-10s\n", lib->name, lib->version, lib->filepath, lib->is_loaded ? "已加载" : "未加载"); } // 演示版本比较 printf("\n5. 版本比较演示:\n"); struct { const char *version1; const char *version2; const char *description; } version_pairs[] = { {"2.31", "2.30", "向前兼容"}, {"2.29", "2.31", "向后兼容检查"}, {"3.0.0", "2.9.9", "大版本升级"}, {"2.31.1", "2.31.0", "补丁版本"}, {NULL, NULL, NULL} }; for (int i = 0; version_pairs[i].version1; i++) { printf(" %s vs %s: %s\n", version_pairs[i].version1, version_pairs[i].version2, version_pairs[i].description); } // 显示版本管理策略 printf("\n=== 版本管理策略 ===\n"); printf("1. 版本兼容性:\n"); printf(" ✓ 主版本号变化:可能不兼容\n"); printf(" ✓ 次版本号变化:向后兼容\n"); printf(" ✓ 修订版本号变化:完全兼容\n"); printf("\n2. 加载策略:\n"); printf(" ✓ 优先加载最新兼容版本\n"); printf(" ✓ 支持版本回退\n"); printf(" ✓ 支持并行版本加载\n"); printf(" ✓ 支持版本冲突解决\n"); printf("\n3. 安全策略:\n"); printf(" ✓ 版本签名验证\n"); printf(" ✓ 依赖关系检查\n"); printf(" ✓ 兼容性测试\n"); printf(" ✓ 回滚机制\n"); return 0; }
int main() { return demo_version_management(); }
|