CN110362356B - 函数数据处理方法、装置、计算机设备和存储介质 - Google Patents
函数数据处理方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN110362356B CN110362356B CN201810311892.5A CN201810311892A CN110362356B CN 110362356 B CN110362356 B CN 110362356B CN 201810311892 A CN201810311892 A CN 201810311892A CN 110362356 B CN110362356 B CN 110362356B
- Authority
- CN
- China
- Prior art keywords
- function
- library
- link
- original
- party
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请涉及一种函数数据处理方法、装置、计算机设备和存储介质,所述方法包括:获取链接配置文件,根据链接配置文件中的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接;加载自定义函数,将自定义函数加载至全局符号表中;在动态库中查找对应的第三方库对应的链接库;加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中。通过自定义同名函数,并且将同名函数对应的动态库放置在第三库对应的链接库前面,在不修改源代码的情况下,实现对原始函数的劫持,从而提高编码效率。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种函数数据处理方法、装置、计算机设备和存储介质。
背景技术
随着计算机技术的发展,计算机技术应用到各个技术领域。在计算机编程过程中,由于在调用第三方函数库中的函数实现对应的功能时,通常需要对第三方库函数的源代码进行修改,实现不同的函数功能,传统技术一般是通过人工阅读对应的源代码,了解源代码的实现方法和源代码的实现原理,从而修改源代码使得源代码实现对应的函数功能,而阅读源代码会耗费大量的时间,导致编码效率低下。
发明内容
基于此,有必要针对上述技术问题,提供一种通过对第三方库函数进行劫持,从而实现不同函数功能,提高编码效率的函数数据处理方法、装置、计算机设备和存储介质。
一种函数数据处理方法,包括:
生成自定义函数,自定义函数与第三方库中的原始函数同名,自定义函数中包括函数符号获取函数,函数符号获取函数用于记录原始函数,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能;
编译自定义函数生成对应的第一动态链接库;
生成链接配置文件,链接配置文件用于配置链接库的链接顺序,指定第一动态链接库先于第三方库对应的链接库进行链接。
一种函数数据处理装置,包括:
函数生成模块,用于生成自定义函数,自定义函数与第三方库中的原始函数同名,自定义函数中包括函数符号获取函数,函数符号获取函数用于记录原始函数,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能;
函数编译模块,用于编译自定义函数生成对应的第一动态链接库;
配置文件生成模块,用于生成链接配置文件,链接配置文件用于配置链接库的链接顺序,指定第一动态链接库先于第三方库对应的链接库进行链接。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如如下步骤:
生成自定义函数,自定义函数与第三方库中的原始函数同名,自定义函数中包括函数符号获取函数,函数符号获取函数用于记录原始函数,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能;
编译自定义函数生成对应的第一动态链接库;
生成链接配置文件,链接配置文件用于配置链接库的链接顺序,指定第一动态链接库先于第三方库对应的链接库进行链接。
一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如下步骤:
生成自定义函数,自定义函数与第三方库中的原始函数同名,自定义函数中包括函数符号获取函数,函数符号获取函数用于记录原始函数,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能;
编译自定义函数生成对应的第一动态链接库;
生成链接配置文件,链接配置文件用于配置链接库的链接顺序,指定第一动态链接库先于第三方库对应的链接库进行链接。
上述函数数据处理方法、装置、计算机设备和存储介质,通过生成自定义函数,自定义函数与第三方库中的原始函数同名,自定义函数中包括函数符号获取函数,函数符号获取函数用于记录原始函数,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能,编译自定义函数生成对应的第一动态链接库,生成链接配置文件,链接配置文件用于配置链接库的链接顺序,指定第一动态链接库先于第三方库对应的链接库进行链接。通过自定义函数中定义的函数规则,和配置文件配置的规则,在后续实现执行函数过程中,根据上述定义好的规则执行函数时,按照先加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,再加载第三方库函数对应的链接库,由于同名函数,则不在将第三方库中的原始函数加载至全局符号表中,在不修改源代码的情况下,根据条件执行不同功能的函数,提高编码效率。
一种函数数据处理方法,包括:
获取链接配置文件,根据链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接;
加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能;
根据链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库;
加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中。
一种函数数据处理装置,包括:
链接模块,用于获取链接配置文件,根据链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接;
符号加载模块,用于加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能;
第三方链接库加载模块,用于根据链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库,加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中。
一种计算机可读存储介质,存储有计算机程序,计算机程序被处理器执行时,使得处理器执行如下步骤:
获取链接配置文件,根据链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接;
加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能;
根据链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库;
加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如如下步骤:
获取链接配置文件,根据链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接;
加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能;
根据链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库;
加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中。
上述函数数据处理方法、装置、计算机设备和存储介质,通过获取链接配置文件,根据链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接,加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能,根据链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库,加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中。通过自定义与第三方库中的原始函数的同名函数,在程序执行过程中,先调用自定义函数,将自定义函数的函数符号加载至全局符号表中,再缓存第三方库中原始函数的函数符号,不再将原始符号加载至全局符号表中,根据条件选择执行原始函数或执行第一函数,在不修改第三方库中源代码的情况下实现函数的不同功能,提高编码效率。
附图说明
图1为一个实施例中函数数据处理方法的应用环境图;
图2为一个实施例中函数数据处理方法的流程示意图;
图3为另一个实施例中函数数据处理方法的流程示意图;
图4为再一个实施例中函数数据处理方法的流程示意图;
图5为一个具体实施例中函数数据处理方法的流程示意图;
图6为一个实施例中函数数据处理装置的结构框图;
图7为另一个实施例中函数数据处理装置的结构框图;
图8为再一个实施例中函数数据处理装置的结构框图;
图9为一个实施例中函数执行模块的结构框图;
图10为另一个实施例中函数执行模块的结构框图;
图11为一个实施例中计算机设备的结构框图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
图1为一个实施例中函数数据处理方法的应用环境图。在该应用环境中,包括终端110以及服务器120。终端110用于生成自定义函数,自定义函数与第三方库中的原始函数同名,自定义函数中包括函数符号获取函数,函数符号获取函数用于记录原始函数,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能,编译自定义函数生成对应的第一动态链接库,生成链接配置文件,链接配置文件用于配置链接库的链接顺序,指定第一动态链接库先于第三方库对应的链接库进行链接。将生成好的函数、编译后得到的动态链接库和生成的链接配置文件发送至服务器120。
上述生成自定义函数、第一动态链接库和链接配置文件的过程也可以在服务器120中进行,服务器可以将生成好的上述文件数据发送至终端110。终端110和服务器120通过网络连接。终端110具体可以是台式终端或移动终端,移动终端具体可以手机、平板电脑、笔记本电脑等中的至少一种。服务器120可以用独立的服务器或者是多个服务器组成的服务器集群来实现。
如图2所示,在一个实施例中,提供了一种函数数据处理方法。本实施例主以该方法应用于上述图1中的终端110(或服务器120)来举例说明。参照图2,该函数数据处理方法具体包括如下步骤:
步骤S202,生成自定义函数,自定义函数与第三方库中的原始函数同名,自定义函数中包括函数符号获取函数,函数符号获取函数用于记录原始函数,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能。
具体地,自定义函数是自定义的用于实现特定功能的函数,该函数由一个或多个程序语句组成。其中自定义函数的函数名称与第三方库中的原始函数的名称相同,原始函数为第三方库中本身存在的函数,如第三方库中的原始函数包括函数名为“close、connect、read”等函数,则自定义函数时定义的函数名为与原始函数同名的函数,即自定义函数的函数名为“close、connect、read”等。自定义函数中包括函数符号获取函数和根据条件选择执行不同的函数,不同的函数实现不同的功能,其中条件可以根据需求自定义,如根据自定义函数对应的应用场景定义相应的条件,不同的应用场景可以采用不同的条件。应用场景包括但不限于即时通信软件的后台数据管理或各种分布式系统的开发框架等,当应用场景为即时通信软件的后台数据管理时,可以将条件设置为检测即时通信软件的并发数据等,并发数据包括但不限于并发客户端数量、响应时长等。
其中函数符号获取函数是用于从第三方库中获取对应的函数符号,如自定义函数中包含的函数符号获取函数为mt_hook_syscall(),通过该函数调用第三方库中的原始函数,该函数调用时可以采用mt_hook_syscall(name)语句,其中name是指原始函数的函数名称,程序语句mt_hook_syscall(read)是指从第三方库中获取“read”函数。其中第一函数可以是但不限于自定义的函数,第一函数实现的功能与原始函数实现的功能不相同。在一个实施例中,函数符号获取函数中包括dlsym函数,该函数具体使用方式为dlsym(RTLD_NEXT,NAME),RTLD_NEXT用于定义第三方库函数的地址,NAME为函数符号。
在一个实施例中,第一函数包括多个子函数,根据预设条件选择执行各个子函数。
具体地,预设条件可以根据需求自定义,如根据第一函数对应的应用场景的状态数据确定或根据第一函数中各个子函数的执行状态确定。在一个实施例中,第一函数各个子函数执行的预设条件为根据各个子函数的执行状态确定,如当第一函数包括3个子函数时,第一函数中的第二个子函数是否执行依赖第一个子函数的执行结果,当第一个子函数的执行结果为正确执行时,执行第二个子函数,第三个子函数的是否执行依赖于第二个子函数的执行结果,当第二子函数的执行结果为正确执行时,执行第三个子函数,反之则不执行第三个子函数。不同的预设条件执行不同的函数,使得函数能够适应更多的场景或保证函数的正确执行。
步骤S204,编译自定义函数生成对应的第一动态链接库。
具体地,动态链接库是一种不可执行的二进制程序文件,用于实现程序共享或执行特殊任务所必需的代码和/或其他资源。其中,编译是指把源程序(高级程序)翻译成目标程序(机器语言),如对自定义函数进行编译,将自定义函数编译成对应的二进制文件。根据编译规则对自定义函数进行编译,得到与该自定义函数对应的动态链接库,将该动态链接库作为第一动态链接库。在一个实施例中,根据编译自定义函数生成的第一动态链接库为libmt.so,第三方库自带的链接库为libmysqlclient.so。
步骤S206,生成链接配置文件,链接配置文件用于配置链接库的链接顺序,指定第一动态链接库先于第三方库对应的链接库进行链接。
其中,链接配置文件是用于配置链接规则的,链接规则包括但不限于链接顺序。链接顺序是指各个链接库的链接顺序。如链接顺序为先链接第一动态链接库,再链接第三方库对应的链接库。
第一动态链接库是通过编译自定义函数得到的动态链接库,第三方库对应的链接库是编译第三方库中的原始函数得到的动态链接库,第三方库对应的链接库可以直接获取其他程序编译的动态链接库,也可以是第三方库自带的链接库。
具体地,在终端获取到链接配置文件后,可以选择性对链接配置文件中的各个配置选项进行配置,如在配置链接配置文件中时选择对链接顺序选项进行配置,链接顺序可以根据需求自定义,如根据链接库放置的位置顺序确定,设放置在前面的先链接,放置在后面的后链接。在对链接配置文件中的配置选项进行配置之后,生成对应的链接配置文件。链接配置文件的链接顺序用于在后续执行自定义函数时,确定动态链接库的加载顺序。如链接配置文件可以为makefile文件,在Makefile文件中定义链接顺序,具体的定义包括但不限于LIB=-L$(MT_LIB_PATH)-L$(MYSQL_LIB_PATH)。其中MT_LIB_PATH是自定义函数对应的动态链接库的路径,MYSQL_LIB_PATH为第三方库对应的链接库对应的路径。
上述函数数据处理方法,通过生成自定义函数,自定义函数与第三方库中的原始函数同名,自定义函数中包括函数符号获取函数,函数符号获取函数用于记录原始函数,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能,编译自定义函数生成对应的第一动态链接库,生成链接配置文件,链接配置文件用于配置链接库的链接顺序,指定第一动态链接库先于第三方库对应的链接库进行链接。在定义函数时,将自定义函数的函数名与第三方库中的原始函数名设置为同样的函数名,同样的函数名在执行过程中同名函数的不同打开方式或编译过程,可以实现同名函数中的任意一个函数覆盖另一个函数,故通过定义同名函数,在函数执行过程中通过同名函数中的自定义函数劫持原始函数,对第三库中的源代码不进行修改的情况下,实现函数的不同功能,从而提高编码效率。
在一个实施例中,上述函数数据处理方法还包括:
步骤S302,自定义函数用于在第一条件下执行原始函数实现socket阻塞模型,在第二条件下执行第一函数实现socket非阻塞模型。
其中,第一条件和第二条件是根据自定义函数对应的应用场景的状态参数确定的。状态参数包括但不限于应用场景对应的数据吞吐量、响应时长、每秒查询率(Query PerSecond,QPS),并发用户数量等。Socket为网络上的两个程序通过一个双向的通信连接实现数据交换过程中连接的一端。
socket阻塞模型是指当socket得到一个输入流,从输入流中读取数据,当输入流中不存在数据时,线程暂停,处于等待数据到来的状态。阻塞模型的编程逻辑简单,便于控制,适用于并发用户数量少、数据吞吐量小的情况。socket非阻塞模型是指线程不会暂停,执行函数时,返回执行函数对应的执行结果,且还会继续执行其他线程功能。非阻塞模式效率高适用于高并发,并发用户数量多、数据吞吐量大和每秒查询率高的情况,如聊天室、即时通信软件,如QQ和微信等适合采用非阻塞模式。具体地,当原始函数的状态参数满足第一条件时,执行原始函数,实现socket阻塞模型,当原始函数的状态参数不满足第一条件时,执行第一函数,实现socket非阻塞模型。根据不同的条件执行不同的函数,在不修改源代码的情况下,可以将socket阻塞模型转换为socket非阻塞模型。
在一个实施例中,上述函数数据处理方法还包括:
步骤S304,第一条件和第二条件是根据自定义函数对应的应用场景下的数据吞吐量确定的,其中当数据吞吐量小于或等于预设值时,满足第一条件,当数据吞吐量大于预设值时,满足第二条件。
具体地,数据吞吐量为端口在单位时间内成功传送数据的数量。根据自定义函数对应的应用场景下的数据吞吐量确定自定义函数所执行的函数。预设值是预先设置的临界值,对自定义函数对应的应用场景下的数据吞吐量于预设值进行对比,根据对比结果确定自定义函数所执行的函数。当数据吞吐量小于或等于预设值时,满足第一条件,执行原始函数,实现socket阻塞模型,当数据吞吐量大于预设值时,满足第二条件,执行第一函数,实现socket非阻塞模型。根据自定义函数对应的应用场景的数据吞吐量确定执行的函数能够根据实际应用场景确定。对数据吞吐量要求比较低可以采用socket阻塞模型,如能够对大量数据进行分布式处理的软件框架hadhoop,软件框架hadhoop对数据吞吐量要求比较低,故软件框架hadhoop可以采用socket阻塞模型,对于即时通信软件等对数据吞吐量要求比较高的通信软件可以采用socket非阻塞模型。根据自定义函数对应的应用场景的数据吞吐量确定执行条件,根据执行条件执行对应的函数,实现对应的功能,从而提高编码效率。
参考图1,图1为一个实施例中函数数据处理方法的应用环境图。终端110获取链接配置文件,根据链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接,加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能,根据链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库,加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中,将加载的函数符号等发送给服务器120。
上述获取链接配置文件。根据链接配置文件执行链接库的加载和符号函数的加载也可以在服务器120中进行,服务器120可以将加载的函数符号等发送给终端110。终端110和服务器120通过网络连接。终端110具体可以是台式终端或移动终端,移动终端具体可以手机、平板电脑、笔记本电脑等中的至少一种。服务器120可以用独立的服务器或者是多个服务器组成的服务器集群来实现。
如图3所示,在一个实施例中,提供了一种函数数据处理方法。本实施例主以该方法应用于上述图1中的终端110(或服务器120)来举例说明。参照图3,该函数数据处理方法具体包括如下步骤:
步骤S402,获取链接配置文件,根据链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接。
其中,链接配置文件为步骤S206中生成的配置文件,链接顺序用于定义动态链接库的链接顺序。第一动态链接库为步骤S204中生成的动态链接库,第三方库对应的链接库为预先编译好的动态链接库,该链接库可以但不限于第三方库自带的链接库或从网络中下载的编译后的动态链接库。
具体地,终端或服务器获取已配置好的链接配置文件,该配置文件在配置链接顺序时根据链接库的放置顺序确定链接顺序,如将第一动态链接库放在第三方库对应的链接库前面,即链接顺序为先对第一动态链接库进行链接,再对第三方库对应的链接库进行链接。如在动态库中查询第一动态链接库libmt.so,其中第一动态链接库libmt.so放置在第三方库对应的链接库libmysqlclient.so前面,加载顺序为先加载libmt.so,在加载libmysqlclient.so。
步骤S404,加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能。
具体地,自定义函数为步骤S202中生成的自定义函数,原始函数为与第三方库中的函数,原始函数与自定义函数同名。符号表为在编译过程中,用于记录源程序的各种名字的特性信息的表格,其中名字包括但不限于函数名、变量名、用户定义类型等,特性信息包括但不限于名字种类、类型、维数、目标地址等。编译过程中编译到引用所声明的变量或赋值等程序语句,对程序语句进行语法正确性检查,如检测变量类型是否符合要求时,可以通过查找符号表中相关的变量类型信息,根据查找到的相关信息确定程序语句的语法是否正确。
在执行函数过程中,对函数语法正确性进行解析时,先加载第一动态链接库中的自定义函数的信息,并将自定义函数对应的名字的特性信息加载至全局符号表中。以connect函数为例,在加载第一动态链接库libmt.so后,在libmt.so中查找connect函数,并将libmt.so中的connect函数加载全局符号表中。自定义函数中包括根据条件选择执行对应的函数功能,其中执行的函数包括但不限于原始函数和第一函数,第一函数的原始函数实现不同的功能,以socket函数为例,原始函数可以实现socket的阻塞模型,第一函数可以实现socket非阻塞模型。
步骤S406,根据链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库。
步骤S408,加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中。
具体地,在查找第一动态链接库中自定义函数的信息后,根据链接配置文件中的指定的链接顺序,在链接库中查找第三方库对应的链接库,并在第三方库对应的链接库中查找与自定义函数同名的原始函数。由于动态链接库的符号加载特性为当共享对象被加载时,符号表被合并到进程的全局符号表中,如果存在相同的符号名时,则后面加入的符号被忽略。故当全局符号表中存在自定义函数符号时,与自定义函数同名的第三方库中的原始函数,则不在加载。以connect函数为例,加载libmysqlclient.so,在libmysqlclient.so中查找connect函数,但不在全局符号表中再次加载connect函数符号。
上述函数数据处理方法,通过获取链接配置文件,根据链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接,加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能,根据链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库,加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中。在执行程序时,由于函数符号加载过程中,对于已经存在同样的函数名的函数,后面加入的同名函数会被忽略,因此可以通过函数符号的加载特性实现对第三方库中原始函数的劫持,根据预设条件选择执行的对应的函数,从而提高编码效率。
如图4所示,在一个实施例中,上述函数数据处理方法还包括:
步骤S602,接收函数调用指令,根据函数调用指令调用第一动态链接库中的自定义函数。
具体地,函数调用指令是用于调用函数的指令,通过该函数调用指令从函数库的编译文件中查找对应的函数。如当函数调用指令调用的是自定义函数时,当终端接收到调用自定义函数的调用指令时,从终端中存储的第一动态链接库中查找自定义函数,并执行自定义函数。以connect函数为例,当调用connect函数,先调用的是libmt.so中的connect符号,即mt_sys_hook.cpp中定义的connect函数。在执行connect函数时,会先调用mt_hook_syscall()记录第三方库中的原始的socket函数,加载第三方库中的原始的connect函数,但是是否执行原始的connect函数还是执行自定义的第一函数,需根据自定义函数对应的应用场景的状态参数确定的,该状态参数可以包含一个或多个应用场景中用于判定软件或接口等的参数。
步骤S604,获取当前执行状态参数,当当前执行状态参数满足第一条件时,执行原始函数。
具体地,当前执行状态参数是指函数准备执行时的执行状态参数,该状态参数可以是预先配置好的,也可以是函数定义过程中自定义的。获取当前执行状态参数,并对当前执行状态参数进行判定,当判定结果为当前执行状态参数满足第一条件时,执行原始函数。原始函数的功能包括但不限于用于实现socket阻塞模式。其中当前执行状态参数包含至少一个参数,当存在一个参数时,对一个参数进行验证,验证该参数是否符合第一条件,当存在多个参数时,需对每一个参数进行验证,验证每一个参数是否都符合第一条件。
步骤S606,当当前执行状态参数满足第二条件时,执行第一函数。
具体地,当判定结果为当前执行状态参数满足第二条件时,执行第一函数。第一函数的功能包括但不限于用于实现socket非阻塞模式。其中第二条件可以为与第一条件完全相反的条件,或部分条件一致的条件。如当当前执行状态参数包含多个参数时,第一条件中的部分参数的参数状态与第二条件中的部分参数的状态参数一致,第一条件中剩余部分参数的参数状态与第二条件中剩余部分参数的状态参数不一致。根据不同的条件执行不同的函数,实现不同的函数功能,使得函数更为灵活。
在一个实施例中,上述函数数据处理方法还包括:
获取自定义函数对应的应用场景下的数据吞吐量,当数据吞吐量小于或等于预设值时,满足第一条件,当数据吞吐量大于预设值时,满足第二条件。
具体地,在终端获取到自定义函数对应的应用场景下的数据吞吐量后,对数据吞吐量进行判断,对数据吞吐量的判断具体可参考步骤S304,在此不再赘述。
如图5所示,在一个具体的实施例中,上述函数数据处理方法包括:
步骤S802,生成自定义函数。自定义函数的函数名与第三方库中的原始函数的函数名一致。定义函数包括但不限于函数符号获取函数和根据预先设置的条件选择执行对应的函数,执行函数包括与原始函数和第一函数。
步骤S804,编译自定义函数。函数的编译是指根据编译规则对函数进行编译生成对应的编译文件。当对自定义函数进行动态编译时,得到自定义函数对应的动态链接库,将该动态链接库作为第一动态链接库。
步骤S806,生成链接配置文件。链接配置文件中包括用于配置链接库的链接顺序,其中链接顺序是根据链接库文件放置的先后顺序确定的,如将第一动态链接库放置在第三方库对应的链接库前面时,链接顺序为先链接第一动态链接库,在链接第三方库对应的链接库。
步骤S808,获取链接配置文件,根据链接配置文件中的链接顺序在动态库中查找对应的第一动态链接库。当链接配置文件中配置的链接顺序为先链接第一动态链接库,再链接第三方库对应的链接库时,在动态链接库中查找第一动态链接库。
步骤S810,加载自定义函数。加载第一动态链接库中的自定义函数,并将该自定义函数对应的特性信息加载至全局符号表中,该自定义函数为步骤S802中生成的自定义函数。
步骤S812,加载第三方库对应的链接库。从动态链接库中查找第三方库对应的链接库,加载第三方库对应的链接库,在步骤S810中已经记载了自定义函数对应的特性信息,在第三方库对应的链接库中查找到的原始函数与自定义函数为同名函数,由于全局符号加载特性对于同名函数不在重复加载,故不在加载原始函数的特性信息。
步骤S814,接收函数调用指令,根据函数调用指令调用第一动态链接库中的自定义函数。当接收到自定义函数的调用指令时,根据该调用指令调用自定义函数。
步骤S816,获取当前执行状态参数,根据当前执行状态参数选择执行对弈的函数。获取当前执行状态参数,对当前状态参数进行判断,不同的状态参数对应不同的函数执行步骤。
在一个具体的实施例中,如在源文件mt_sys_hook.cpp和头文件mt_sys_hook.h中定义socket的同名函数,其中与第三方库中的原始函数同名的自定义函数包括但不限于socket、close、connect、read、write、sendto、recvfrom、recv、send、setsockopt、fcntl、ioctl等函数。通过执行自定义函数来实现对第三方库中的原始函数的劫持,并利用函数符号获取函数缓存第三方库中的原始函数,供禁用微线程模式时调用。具体的实现步骤如下:
a.实现宏mt_hook_syscall(),调用dlsym(RTLD_NEXT,NAME)从第三方库中获取原始函数的函数符号。当应用程序执行mt_hook_syscall(NAME)时获取原始函数的函数符号。如执行mt_hook_syscall(connect)时,从第三方库中获取connect函数。
b.自定义函数,供应用程序调用,以connect函数为例,自定义connect函数,供微线程调用。
c.链接时,将微线程库的动态链接库放在第三方库对应的链接库前面,如在链接配置文件makefile中指定LIB=-L$(MT_LIB_PATH)-L$(MYSQL_LIB_PATH)-l$(MYSQL_LIB)。
d.程序启动时,会先加载第一动态链接库,并将第一动态链接库中的自定义函数加载至全局符号中,然后加载第三方库对应的链接库,当处理第三方库对应的链接库中的原始函数时,由于同名的自定义函数,已注册到全局符号表中了,则不再加载该函数符号。如加载第一动态链接库libmt.so,并将libmt.so中的connect函数加载全局符号表中,然后加载libmysqlclient.so,当处理libmysqlclient.so中的connect符号时,由于同名的connect符号,已注册到全局符号表了,则不再加载该符号。
e.应用程序运行时,当调用自定义函数时,先调用的是第一动态链接库中的自定义函数符号,在执行自定义函数时,会先调用函数获取函数,从第三方库中获取原始函数的函数符号,供禁用微线程模式时调用。根据预先设置的条件确定是执行原始函数,还是执行微线程中的函数,该函数可以是自定义的函数。如当调用connect函数,此时调用的是libmt.so中的connect符号,即mt_sys_hook.cpp中定义的connect函数,在执行connect函数时,会先调用mt_hook_syscall()记录第三方库中的原始的connect函数,供禁用微线程模式时调用。然后根据预设条件决定是执行第三方库中的connect函数,还是调用微线程版的connect函数。当然为线程版的connect函数与第三方库中的connect函数实现不同的功能。在对原始函数connect进行劫持时,并不需要对原始函数connect的代码进行阅读,也不需要修改原始函数connect的代码内容进行修改,通过自定义函数中设置函数符号获取函数,该函数用于获取第三方库中原始函数的函数符号,在自定义函数中设置对应的条件,根据条件执行不同的函数,实现不同的函数功能。
如图6所示,在一个实施例中,提供一种函数数据处理装置200,包括:
函数生成模块202,用于生成自定义函数,自定义函数与第三方库中的原始函数同名,自定义函数中包括函数符号获取函数,函数符号获取函数用于记录原始函数,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能。
函数编译模块204,用于编译自定义函数生成对应的第一动态链接库。
配置文件生成模块206,用于生成链接配置文件,链接配置文件用于配置链接库的链接顺序,指定第一动态链接库先于第三方库对应的链接库进行链接。
在一个实施例中,函数数据处理装置200,还包括:
函数定义模块208,用于自定义函数用于在第一条件下执行原始函数实现socket阻塞模型,在第二条件下执行第一函数实现socket非阻塞模型。
在一个实施例中,函数数据处理装置200,还包括:
执行条件确定模块210,用于第一条件和第二条件是根据自定义函数对应的应用场景下的数据吞吐量确定的,其中当数据吞吐量小于或等于预设值时,满足第一条件,当数据吞吐量大于预设值时,满足第二条件。
如图7所示,在一个实施例中,提供一种函数数据处理装置400,包括:
链接模块402,用于获取链接配置文件,根据链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接。
函数符号加载模块404,用于加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能。
第三方链接库加载模块406,用于根据链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库,加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中。
如图8所示,在一个实施例中,提供一种函数数据处理装置400,还包括:
函数调用模块602,用于接收函数调用指令,根据函数调用指令调用第一动态链接库中的自定义函数。
函数执行模块604,用于获取当前执行状态参数,当当前执行状态参数满足第一条件时,执行原始函数,当当前执行状态参数满足第二条件时,执行第一函数。
如图9所示,在一个实施例中,函数执行模块604包括:
第一执行单元6042,用于执行原始函数,实现socket阻塞模型。
第二执行单元6044,用于执行第一函数,实现socket非阻塞模型。
如图10所示,在一个实施例中,函数执行模块604还包括:
吞吐量获取单元6046,用于获取自定义函数对应的数据吞吐量。
执行条件确定单元6048,用于当数据吞吐量小于等于预设阈值时,满足第一条件,当数据吞吐量大于预设值时,满足第二条件。
在一个实施例中,第二执行单元6044,还用于第一函数包括多个子函数,根据预设条件选择执行各个子函数。
图11示出了一个实施例中计算机设备的内部结构图。该计算机设备具体可以是图1中的终端110(或服务器120)。如图11所示,该计算机设备包括该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、输入装置和显示屏。其中,存储器包括非易失性存储介质和内存储器。该计算机设备的非易失性存储介质存储有操作系统,还可存储有计算机程序,该计算机程序被处理器执行时,可使得处理器实现函数数据处理方法。该内存储器中也可储存有计算机程序,该计算机程序被处理器执行时,可使得处理器执行函数数据处理方法。计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图11中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,本申请提供函数数据处理装置可以实现为一种计算机程序的形式,计算机程序可在如图11所示的计算机设备上运行。计算机设备的存储器中可存储组成该函数数据处理装置的各个程序模块,比如,图6所示的函数生成模块202、函数编译模块204和配置文件生成模块206或图7所示的链接模块402、函数符号加载模块404和第三方链接库加载模块406。各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本申请各个实施例的函数数据处理方法中的步骤。
例如,图11所示的计算机设备可以通过如图6所示函数数据处理装置200中的函数生成模块202执行生成自定义函数,自定义函数与第三方库中的原始函数同名,自定义函数中包括函数符号获取函数,函数符号获取函数用于记录原始函数,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能。计算机设备可通过函数编译模块204执行编译自定义函数生成对应的第一动态链接库。计算机设备可通过配置文件生成模块206执行生成链接配置文件,链接配置文件用于配置链接库的链接顺序,指定第一动态链接库先于第三方库对应的链接库进行链接。
在一个实施例中,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:获取链接配置文件,根据链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接,加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能,根据链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库,加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中。
在一个实施例中,自定义函数用于在第一条件下执行原始函数实现socket阻塞模型,在第二条件下执行第一函数实现socket非阻塞模型。
在一个实施例中,第一条件和第二条件是根据自定义函数对应的应用场景下的数据吞吐量确定的,其中当数据吞吐量小于或等于预设值时,满足第一条件,当数据吞吐量大于预设值时,满足第二条件。
例如,图11所示的计算机设备可以通过如图7所示函数数据处理装置400的链接模块402执行获取链接配置文件,根据链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接。算机设备可通过函数符号加载模块404执行加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能。算机设备可通过第三方链接库加载模块406执行根据链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库,加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中。
在一个实施例中,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:获取链接配置文件,根据链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接,加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能,根据链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库,加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:接收函数调用指令,根据函数调用指令调用第一动态链接库中的自定义函数,获取当前执行状态参数,当当前执行状态参数满足第一条件时,执行原始函数,当当前执行状态参数满足第二条件时,执行第一函数。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:执行原始函数实现socket阻塞模型,执行第一函数用于实现socket非阻塞模型。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:获取自定义函数对应的应用场景下的数据吞吐量,当数据吞吐量小于或等于预设值时,满足第一条件,当数据吞吐量大于预设值时,满足第二条件。
在一个实施例中,第一函数包括多个子函数,根据预设条件选择执行各个子函数。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:获取链接配置文件,根据链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接,加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能,根据链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库,加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中。
在一个实施例中,自定义函数用于在第一条件下执行原始函数实现socket阻塞模型,在第二条件下执行第一函数实现socket非阻塞模型。
在一个实施例中,第一条件和第二条件是根据自定义函数对应的应用场景下的数据吞吐量确定的,其中当数据吞吐量小于或等于预设值时,满足第一条件,当数据吞吐量大于预设值时,满足第二条件。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:获取链接配置文件,根据链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库,链接配置文件中指定第一动态链接库先于第三方库对应的链接库进行链接,加载第一动态链接库中的自定义函数,将自定义函数加载至全局符号表中,自定义函数用于根据条件选择执行原始函数或执行第一函数,第一函数与原始函数实现不同的功能,根据链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库,加载第三方库对应的链接库,当全局符号表中存在与第三方库对应的链接库中的原始函数同名的函数符号时,无需加载原始函数至全局符号表中。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:接收函数调用指令,根据函数调用指令调用第一动态链接库中的自定义函数,获取当前执行状态参数,当当前执行状态参数满足第一条件时,执行原始函数,当当前执行状态参数满足第二条件时,执行第一函数。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:执行原始函数实现socket阻塞模型,执行第一函数实现socket非阻塞模型。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:获取自定义函数对应的应用场景下的数据吞吐量,当数据吞吐量小于或等于预设值时,满足第一条件,当数据吞吐量大于预设值时,满足第二条件。
在一个实施例中,第一函数包括多个子函数,根据预设条件选择执行各个子函数。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (6)
1.一种函数数据处理方法,包括:
生成自定义函数,所述自定义函数与第三方库中的原始函数同名,所述自定义函数中包括函数符号获取函数,所述函数符号获取函数用于从所述第三方库中获取所述原始函数的函数符号,所述自定义函数用于在第一条件下执行所述原始函数实现socket阻塞模型,在第二条件下执行第一函数以实现socket非阻塞模型;
编译所述自定义函数生成对应的第一动态链接库;
生成链接配置文件,所述链接配置文件用于配置链接库的链接顺序,指定所述第一动态链接库先于所述第三方库对应的链接库进行链接;
获取所述链接配置文件,根据链接配置文件中的链接顺序在动态链接库中查找对应的所述第一动态链接库;
加载所述第一动态链接库中的自定义函数,并将该自定义函数对应的特性信息加载至全局符号表中;其中,所述特性信息包括名字种类、类型、维数、目标地址;名字包括函数名、变量名、用户定义类型;
从动态链接库中查找第三方库对应的链接库,加载所述第三方库对应的链接库;其中,当所述全局符号表中存在与所述第三方库对应的链接库中的原始函数同名的函数符号时,所述原始函数不加载至所述全局符号表中;
接收函数调用指令,根据所述函数调用指令调用所述第一动态链接库中的所述自定义函数;所述自定义函数在执行时,调用所述函数符号获取函数记录所述第三方库中的原始函数,加载所述第三方库中的原始函数,供满足所述第一条件时调用;
获取所述自定义函数对应的应用场景下的数据吞吐量;
当所述数据吞吐量小于或等于预设值时,满足所述第一条件,执行所述原始函数;
当所述数据吞吐量大于所述预设值时,满足所述第二条件,执行所述第一函数。
2.一种函数数据处理方法,包括:
获取链接配置文件,根据所述链接配置文件中指定的链接顺序在动态库中查找第一动态链接库,所述链接配置文件中指定所述第一动态链接库先于第三方库对应的链接库进行链接;所述第一动态连接库是编译自定义函数生成的;所述第三方库包含原始函数;
加载所述第一动态链接库中的所述自定义函数,将所述自定义函数加载至全局符号表中,所述自定义函数用于根据条件选择执行所述原始函数或执行第一函数,所述第一函数与所述原始函数实现不同的功能;所述自定义函数用于在第一条件下执行所述原始函数以实现socket阻塞模型,在第二条件下执行所述第一函数以实现socket非阻塞模型;
根据所述链接配置文件中指定的链接顺序在动态库中查找所述第三方库对应的链接库;
加载所述第三方库对应的链接库,当所述全局符号表中存在与所述第三方库对应的链接库中的原始函数同名的函数符号时,无需加载所述原始函数至所述全局符号表中;
接收函数调用指令,根据所述函数调用指令调用所述第一动态链接库中的所述自定义函数;所述自定义函数在执行时,调用函数符号获取函数从所述第三方库中获取原始函数的函数符号,加载所述第三方库中的原始函数,供满足所述第一条件时调用;
获取所述自定义函数对应的应用场景下的数据吞吐量;
当所述数据吞吐量小于或等于预设值时,满足所述第一条件,执行所述原始函数;
当所述数据吞吐量大于所述预设值时,满足所述第二条件,执行所述第一函数。
3.一种函数数据处理装置,其特征在于,所述装置包括:
函数生成模块,用于生成自定义函数,所述自定义函数与第三方库中的原始函数同名,所述自定义函数中包括函数符号获取函数,所述函数符号获取函数用于从所述第三方库中获取所述原始函数的函数符号,所述自定义函数用于在第一条件下执行所述原始函数实现socket阻塞模型,在第二条件下执行第一函数以实现socket非阻塞模型;所述第一函数与所述原始函数实现不同的功能;
函数编译模块,用于编译所述自定义函数生成对应的第一动态链接库;
配置模块,用于生成链接配置文件,所述链接配置文件用于配置链接库的链接顺序,指定所述第一动态链接库先于所述第三方库对应的链接库进行链接;
链接模块,用于获取链接配置文件,根据所述链接配置文件中指定的链接顺序在动态库中查找对应的第一动态链接库;
函数符号加载模块,用于加载所述第一动态链接库中的所述自定义函数,将所述自定义函数对应的特性信息加载至全局符号表中;其中,所述特性信息包括名字种类、类型、维数、目标地址;名字包括函数名、变量名、用户定义类型;
第三方链接库加载模块,用于根据所述链接配置文件中指定的链接顺序在动态库中查找对应的第三方库对应的链接库,加载所述第三方库对应的链接库,当所述全局符号表中存在与所述第三方库对应的链接库中的原始函数同名的函数符号时,无需加载所述原始函数至所述全局符号表中;
函数调用模块,用于接收函数调用指令,根据所述函数调用指令调用所述第一动态链接库中的所述自定义函数;所述自定义函数在执行时,调用所述函数符号获取函数记录所述第三方库中的原始函数,加载所述第三方库中的原始函数,供满足所述第一条件时调用;
函数执行模块,用于获取所述自定义函数对应的应用场景下的数据吞吐量;当所述数据吞吐量小于或等于预设值时,满足所述第一条件,执行所述原始函数;当所述数据吞吐量大于所述预设值时,满足所述第二条件,执行所述第一函数。
4.一种函数数据处理装置,其特征在于,所述装置包括:
链接模块,用于获取链接配置文件,根据所述链接配置文件中指定的链接顺序在动态库中查找第一动态链接库,所述链接配置文件中指定所述第一动态链接库先于第三方库对应的链接库进行链接;所述第一动态连接库是编译自定义函数生成的;所述第三方库包含原始函数;
函数符号加载模块,用于加载所述第一动态链接库中的所述自定义函数,将所述自定义函数加载至全局符号表中,所述自定义函数用于根据条件选择执行所述原始函数或执行第一函数,所述第一函数与所述原始函数实现不同的功能;所述自定义函数用于在第一条件下执行所述原始函数以实现socket阻塞模型,在第二条件下执行所述第一函数以实现socket非阻塞模型;
第三方链接库加载模块,用于根据所述链接配置文件中指定的链接顺序在动态库中查找所述第三方库对应的链接库,加载所述第三方库对应的链接库,当所述全局符号表中存在与所述第三方库对应的链接库中的原始函数同名的函数符号时,无需加载所述原始函数至所述全局符号表中;
函数调用模块,用于接收函数调用指令,根据所述函数调用指令调用所述第一动态链接库中的所述自定义函数;所述自定义函数在执行时,调用函数符号获取函数从所述第三方库中获取原始函数的函数符号,加载所述第三方库中的原始函数,供满足所述第一条件时调用;
函数执行模块,用于获取所述自定义函数对应的应用场景下的数据吞吐量;当所述数据吞吐量小于或等于预设值时,满足所述第一条件,执行所述原始函数;当所述数据吞吐量大于所述预设值时,满足所述第二条件,执行所述第一函数。
5.一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如权利要求1至2中任一项所述方法的步骤。
6.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如权利要求1至2中任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810311892.5A CN110362356B (zh) | 2018-04-09 | 2018-04-09 | 函数数据处理方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810311892.5A CN110362356B (zh) | 2018-04-09 | 2018-04-09 | 函数数据处理方法、装置、计算机设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110362356A CN110362356A (zh) | 2019-10-22 |
CN110362356B true CN110362356B (zh) | 2022-06-24 |
Family
ID=68212242
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810311892.5A Active CN110362356B (zh) | 2018-04-09 | 2018-04-09 | 函数数据处理方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110362356B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111984342B (zh) * | 2020-09-03 | 2023-04-07 | 科大讯飞股份有限公司 | 一种加载动态链接库的方法和相关装置 |
CN112650625B (zh) * | 2020-12-28 | 2024-06-14 | 武汉达梦数据技术有限公司 | 一种针对数据库的流式备份还原方法、存储介质及装置 |
CN114840204A (zh) * | 2021-02-02 | 2022-08-02 | 华为技术有限公司 | 非同名符号的函数跳转方法、装置及计算机可读存储介质 |
CN113032046A (zh) * | 2021-03-29 | 2021-06-25 | 北京字节跳动网络技术有限公司 | so文件的修复方法、装置、设备及存储介质 |
CN113590419A (zh) * | 2021-07-23 | 2021-11-02 | 北京沃东天骏信息技术有限公司 | 一种函数管理方法和装置 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106371940A (zh) * | 2015-07-21 | 2017-02-01 | 腾讯科技(深圳)有限公司 | 一种程序崩溃解决方法及装置 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100535856C (zh) * | 2006-10-16 | 2009-09-02 | 中兴通讯股份有限公司 | 一种构造中间库的方法 |
CN100530108C (zh) * | 2007-03-20 | 2009-08-19 | 华为技术有限公司 | 一种调用函数的方法及系统 |
CN102147743A (zh) * | 2011-03-28 | 2011-08-10 | 博视联(苏州)信息科技有限公司 | 加快嵌入式系统应用程序启动速度的方法 |
-
2018
- 2018-04-09 CN CN201810311892.5A patent/CN110362356B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106371940A (zh) * | 2015-07-21 | 2017-02-01 | 腾讯科技(深圳)有限公司 | 一种程序崩溃解决方法及装置 |
Non-Patent Citations (2)
Title |
---|
linux库的依赖和链接的顺序;yuanbinquan;《https://blog.csdn.net/yuanbinquan/article/details/50739868》;20160225;全文 * |
socket的吞吐量问题;nntg;《https://blog.csdn.net/nntg/article/details/564750》;20051229;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN110362356A (zh) | 2019-10-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110362356B (zh) | 函数数据处理方法、装置、计算机设备和存储介质 | |
US20190324772A1 (en) | Method and device for processing smart contracts | |
CN107832100B (zh) | 一种apk插件的加载方法及其终端 | |
CN108121594B (zh) | 一种进程管理方法及装置 | |
US8510712B1 (en) | Testing in-container software objects | |
CN111209122B (zh) | 接口调用方法、装置、电子设备及存储介质 | |
CN111400000B (zh) | 网络请求处理方法、装置、设备和存储介质 | |
CN109445845B (zh) | 接口调用方法、装置、计算机设备和存储介质 | |
CN107807841B (zh) | 服务器模拟方法、装置、设备及可读存储介质 | |
CN114531477B (zh) | 功能组件的配置方法、装置、计算机设备和存储介质 | |
CN111223036A (zh) | 一种gpu虚拟化共享方法、装置及电子设备和存储介质 | |
CN111343236A (zh) | 服务端与客户端进行通讯的方法、装置、通讯系统 | |
CN112699034B (zh) | 虚拟登录用户构建方法、装置、设备及存储介质 | |
CN113168332A (zh) | 数据处理方法、装置以及移动终端 | |
CN109254765B (zh) | 定时任务管理方法、装置、计算机设备及存储介质 | |
CN108132832B (zh) | 应用程序启动方法和装置 | |
CN109711124B (zh) | 管理移动设备方法、装置、计算机设备和存储介质 | |
CN111294377A (zh) | 一种依赖关系的网络请求发送方法、终端装置及存储介质 | |
CN112527416A (zh) | 任务处理方法、装置、计算机设备和存储介质 | |
CN112600931A (zh) | 一种api网关部署方法及装置 | |
CN112947907A (zh) | 一种创建代码分支的方法 | |
CN114745749A (zh) | 虚拟网元测试方法、装置、电子设备及可读存储介质 | |
CN113849195A (zh) | 应用程序加载方法、装置、存储介质以及终端 | |
CN112988755A (zh) | 关联数据的自动选值方法和装置、设备 | |
CN112612474A (zh) | 产品移植方法、装置、存储介质和电子设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |