Linux中的算法分离手段

0. 简介

参数分离对于绝大多数算法开发来说收益是非常大的,因为我们都知道,随着平台的更替,很多时候如果说数据流和算法交叠在一起(即接口与实现合在一起)。这将有可能会导致在迁移平台时候会导致代码难以维护,并有可能会造成莫名的Bug。为了使代码更易于维护和扩展,在修改通信接口时不需要修改相关的算法代码,本文的下面将会介绍几种常用的方法。

1. 通过动态链接库完成链接

动态链接库(Dynamic Link Library,简称DLL)是一种在操作系统中用于共享代码和数据的机制。它是一种可执行的二进制文件,可以被多个程序同时使用,以提高代码的重用性和模块化程度。在C++算法分离中,动态链接库可以用于将算法代码从应用程序中分离出来,使得算法可以独立开发、测试和优化,同时也方便应用程序的调用和升级。

使用动态链接库可以使得算法代码和应用程序代码分别编译和链接,从而实现分离。这样一来,算法代码的修改和升级不会对应用程序造成影响,而应用程序也不必重新编译和链接。动态链接库还可以提高代码的重用性和可维护性,因为同一份动态链接库可以被多个应用程序使用,而且如果需要更新动态链接库,只需替换原文件即可。

对于动态链接库来说,主要分成两步。首先,需要在算法代码中明确定义导出函数(Export Function),以供应用程序调用。

比如说我们会创建一个函数my_pack_test.cpp

#include <stdio.h>
void foobar(int i)
{
  printf("Printing from my_pack_test.so %d\n", i);
}

CMakeList.txt

# include_directories( 这个括号里添加此项目依赖的头文件路径 )
 include_directories(../include)
add_library(my_pack_test 
# SHARED 字段指定testJni为动态链接库
SHARED 
# my_pack_test,为testJni库的cpp文件(生成testJni所需要的cpp都写到此处)
my_pack_test.cpp
)
# libgadl.so 为该testJni库需要链接的so库
target_link_libraries(testJni /home/lib/libgdal.so)
install(TARGETS my_pack_test LIBRARY DESTINATION lib)

这样我们就可以生成一个.so文件了。然后我们就需要在应用程序中使用动态链接库的导入函数(Import Function),以便在程序运行时动态加载动态链接库,并调用其中的算法函数。最后,需要将动态链接库文件放置在应用程序能够搜索到的路径下,以便程序能够找到它。

#include <iostream>
#include "mytool.h" // include the lib header

// include shared lib load
#ifdef _WIN32
#include <windows.h>
#else
#include <dlfcn.h> # in linux, should also link to dl system library when build
#endif

// define shared lib load handler
typedef MyTool *(*CreateMyToolFunc)();

#ifdef _WIN32
HINSTANCE gDllHandler = nullptr;
const char *gDefaultSharedLibPath = "mytool.dll"; // here put it the same path
#else
void *gSoHandler = nullptr;
// 为上面生成的.so文件的绝对路径
const char *gDefaultSharedLibPath = "libmytool.so"; // here put it the same path, some linux must use ./libmytool.so
#endif

int main()
{

#ifdef _WIN32
	// load shared lib
	gDllHandler = LoadLibrary(gDefaultSharedLibPath);
	if (!gDllHandler)
		std::cout << "load shared lib failed" << std::endl;

	CreateMyToolFunc create_mytool = (CreateMyToolFunc)(GetProcAddress(gDllHandler, "CreateMyTool"));
	MyTool *my_tool = create_mytool(); // get the derived class instance from shared lib

	my_tool->fun1();
	int z = my_tool->fun2(2, 3);
	printf("z: %d", z);

	// when all done, unload shared lib
	FreeLibrary(gDllHandler);
	gDllHandler = nullptr;
#else
    // 加载指定的 .so 文件
	gSoHandler = dlopen(gDefaultSharedLibPath, RTLD_LAZY);
	if (!gSoHandler)
		std::cout << "load shared lib failed" << std::endl;

	CreateMyToolFunc create_mytool = (CreateMyToolFunc)(dlsym(gSoHandler, "CreateMyTool"));
    // 查找函数create_mytool,并返回函数指针
	MyTool *my_tool = create_mytool(); // get the derived class instance from shared lib
	// 调用对应的foobar函数打印输出
	my_tool->fun1();
	int z = my_tool->fun2(2, 3);
	printf("z: %d", z);

	// when all done, unload shared lib
	dlclose(gSoHandler);
	gSoHandler = nullptr;
#endif

	return 0;
}

dlopen:该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。这种机制使得在系统中添加或者删除一个模块时,都不需要重新进行编译。
dlsym:在打开的动态库中查找符号的值。
dlclose:关闭动态库。
dlerror:返回一个描述最后一次调用dlopen、dlsym,或dlclose的错误信息的字符串。

2. 通过进程完成链接

2.1 fork()完成子进程和父进程的操作

pid_t fork(void);

0: 子进程
子进程PID(大于0的整数):父进程
-1: 出错

使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:
进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。
子进程与父进程的区别在于:
1、父进程设置的锁,子进程不继承(因为如果是排它锁,被继承的话,矛盾了)
2、各自的进程ID和父进程ID不同
3、子进程的未决告警被清除;
4、子进程的未决信号集设置为空集

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int glob = 6;
int main()
{
    int local;
    int pid;

    local = 88; 
    
    printf("parent[pid = %d]: before fork, glob(&glob) = %d(%p), local(&local) = %d(%p)\n",
        getpid(), glob, &glob, local, &local );
    
    if((pid = fork()) < 0) {
        perror("fail to fork");
        return -1; 
    }   
    
    if(pid == 0) { /* child process */
        printf("child[pid = %d]: after fork, glob(&glob) = %d(%p), local(&local) = %d(%p)\n",
            getpid(), glob, &glob, local, &local );
        glob++;
        local++;    
        printf("child[pid = %d]: changed data after fork, glob(&glob) = %d(%p), local(&local) = %d(%p)\n",
            getpid(), glob, &glob, local, &local );
    }else { /* parent process */
        sleep(2);
        printf("parent[pid = %d]: after fork, glob(&glob) = %d(%p), local(&local) = %d(%p)\n",
            getpid(), glob, &glob, local, &local );
    }   
    /* return euqal to exit(0), but exit may cause a compile warning
     * due to main() is declared to return with an integter 
     */
    
    return 0;  
}

在这里插入图片描述

2.2 exec函数族

…详情请参照古月居

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git Commit Message 应该怎么写?

原文链接&#xff1a; Git Commit Message 应该怎么写&#xff1f; 最近被同事吐槽了&#xff0c;说我代码提交说明写的太差。其实都不用他吐槽&#xff0c;我自己心里也非常清楚。毕竟很多时候犯懒&#xff0c;都是直接一个 -m "fix" 就提交上去了。 这样做是非常…

【案例实践】MCM箱模型实践技术应用与O3形成途径、生成潜势、敏感性分析

气象模型软件&#xff1a;WRF、CMAQ、SMOKE、WRF-chem、WRF-DA、CAMx、PMF、OBM-MCM、CMIP6 查看原文>>>MCM箱模型实践技术应用与O3形成途径、生成潜势、敏感性分析 目录 专题一&#xff1a;大气中O3形成知识基础、MCM和Atchem 2原理及Linux系统安装 专题二&#…

【创作赢红包】Activity初窥门径

上一节中我们对Activity一些基本的概念进行了了解,什么是Activity,Activity的生命周期,如何去启动一个Activity等,本节我们继续来学习Activity,前面也讲了一个App一般都是又多个Activity构成的,这就涉及到了多个Activity间数据传递的问题了,那么本节继续学习Activity的使…

C#,初学琼林(04)——查询(搜索)数组内指定(值)的元素与全文检索“倒排序”技术的实现代码源程序

假设我们有一个 n 元素数组&#xff0c;我们想在其中找到给定元素 x 的元素。a 是一个索引从 0 到 n-1 的数组 。它的元素将被标记为&#xff1a;a[0], a[1]&#xff0c;a[2]&#xff0c;a[3]&#xff0c;...&#xff0c;a[n-1]。 要找到 x 元素&#xff0c;我们将采取以下步骤…

OMG,太牛了!!!华为18级架构师总结出24W字Java面试手册

前言 网上的 Java 基础面试题文章有非常多&#xff0c;但是大部分都比较老了。 很多题目早已不是当前的热门题目&#xff0c;没有必要在这些题目上花太多时间。 很多答案放现在已经不准确&#xff0c;可能会误导新人。 因此&#xff0c;我花了几天时间喊大佬整理了一些时下…

伪数组和真数组的区别

真数组&#xff1a; 真数组具备数组方法&#xff1a;常用的find()、forEach()、join()等等 他的数据类型也是Array&#xff08;数组&#xff09; 真数组示例&#xff1a; let arr [11, 22, 33, 44, 55] console.log(arr); //打印结果 [11, 22, 33, 44, 55]下图可以清晰的…

批发进销存管理软件,商品分类管理,对商品分类批量价格管理,商品分类导入导出的操作

商品分类视频教程 【商品分类】是用来记录公司商品类别的基本资料。 比如超市商品常用分类有&#xff1a;烟酒类&#xff0c;副食类&#xff0c;饮料类&#xff0c;蔬菜类&#xff0c;水果类&#xff0c;等等。 1.【商品分类】管理 电脑【汉码进销存】里&#xff0c;【基础…

SpringCloud服务注册中心——Eureka

Eureka 本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 简介 Eureka是Netflix开发的服务发现框架&#xff0c;本身是一个基于REST的服务&#xff0c;主要用于定位运行在AWS域中的中间层服务&#xff0c;以达到负载均衡和中间层服务故障转移的目的…

华为阿里版ChatGPT横空出世,谁的成效更好呢?

“你训练的大模型涌现了吗&#xff1f;”“还没有。好难受。”一时间成为了最近AI赛道玩家的一个爆热梗。 不管承不承认&#xff0c;相信每个玩家都不愿意输掉这场激烈的竞争。自百度成为国内“第一个吃螃蟹的人”后&#xff0c;又有两大中国科技巨头做好了准备——华为和阿里…

【云原生进阶之容器】第五章容器运行时5.2节--容器运行时接口规范CRI

1 CRI 介绍 在 CRI 出现之前(也就是 Kubernetes v1.5 之前),Docker 作为第一个容器运行时,Kubelet 通过内嵌的 dockershim 操作 Docker API 来操作容器,进而达到一个面向终态的效果。在这之后,又出现了一种新的容器运行时 - rkt,它也想要成为 Kubernetes 支持的一个容器…

[论文速览] Sparks of Artificial General Intelligence: Early experiments with GPT-4

Sparks of Artificial General Intelligence: Early experiments with GPT-4 2023.3.22 微软官方发布了目前人类史上最强AI模型 GPT-4 的综合能力评估论文&#xff0c;总所周知&#xff0c;2023年是通用人工智能&#xff08;Artificial General Intelligence&#xff0c;AGI&a…

esxi的安装配置以及新建虚拟机

esxi的安装配置以及新建虚拟机1_esxi的安装1.1_镜像下载1.2_启动盘制作1.3_安装教程1.3.1_进入Bios Manager选择使用U盘启动1.3.2_配置esxi&#xff08;主要是配置网络&#xff09;1.3.3_远程连接&#xff08;直接在电脑上输入ip地址登录即可&#xff09;2_新建虚拟机装操作系统…

【视频分割】【深度学习】MiVOS官方Pytorch代码--Propagation模块解析

【视频分割】【深度学习】MiVOS官方Pytorch代码–Propagation模块解析 MiVOS模型将交互到掩码和掩码传播分离&#xff0c;从而实现更高的泛化性和更好的性能。单独训练的交互模块将用户交互转换为对象掩码&#xff0c;传播模块使用一种新的top-k过滤策略在读取时空存储器时进行…

No.026<软考>《(高项)备考大全》【第10章】项目沟通和干系人管理(第2部分-干系人管理)

1 干系人管理部分相关 1.1 干系人ITO 1.2 干系人管理 过程过程的定义过程的作用识别干系人识别能影响项目决策、活动或结果的个人、群体或组织&#xff0c;以及被项目决策、活动或者结果影响的个人、群体或者组织&#xff0c;并分析和记录他们的相关信息的过程帮助项目经理建…

【C语言进阶:自定义类型详解】枚举

本节重点内容&#xff1a; 枚举类型的定义枚举的优点枚举的使用⚡枚举类型的定义 枚举&#xff1a;将可能的取值一一列举。比如&#xff1a;一周的天数、性别、一年的月份等等可以使用枚举来将其可能出现情况列举出来。 枚举类型的基本使用&#xff1a; enum Sex//性别 {//…

8个全球性编程比赛,天才程序员的梦想舞台

很多编程爱好者在学习之初&#xff0c;都渴望与全球的程序员一较高下&#xff0c;以证明自己的实力。 一些全球性的编程竞赛为他们提供了这样的机会&#xff0c;不仅可以与全世界的顶尖程序员们交流&#xff0c;还有机会获得丰厚的奖金和进入顶级公司的机会&#xff0c;更重要…

信息收集与运用

目录 一.实验目的 二.实验原理 三.实验内容 一.收集信息 二.猜解密码 三.密码强度检测 源码 测试用例 程序输出结果​编辑 ​四.小结与讨论 1.举出保护个人敏感信息的方法&#xff08;最少三点&#xff09;。 2.如何提高你的密码强壮性&#xff0c;以避免黑客利用密…

蓝桥杯基础9:BASIC-6试题 杨辉三角形

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 杨辉三角形又称Pascal三角形&#xff0c;它的第i1行是(ab)i的展开式的系数。 它的一个重要性质是&#xff1a;三角形中的…

第一批被AI淘汰的人已经出现,你距离失业还有多远?

在我之前的文章有提到过&#xff0c;当chat GPT横空出世之后&#xff0c;AI必然会迎来大爆发&#xff0c;在chat GPT推出后&#xff0c;百度随即推出文心一言&#xff0c;而各个互联网大厂也纷纷入局&#xff0c;这将会导致一大批人失业。 为什么各个互联网大厂会纷纷入局&…

【ansible】实施任务控制

目录 实施任务控制 一&#xff0c;循环&#xff08;迭代&#xff09;--- loop 1&#xff0c;利用loop----item循环迭代任务 2&#xff0c;item---loop循环案例 1&#xff0c;定义item循环列表 2&#xff0c;通过变量应用列表格式 3&#xff0c;字典列表&#xff08;迭代嵌套子…
最新文章