CN102103676A - 一种基于进程间继承关系的爪哇程序进程守护方法 - Google Patents

一种基于进程间继承关系的爪哇程序进程守护方法 Download PDF

Info

Publication number
CN102103676A
CN102103676A CN2011100490416A CN201110049041A CN102103676A CN 102103676 A CN102103676 A CN 102103676A CN 2011100490416 A CN2011100490416 A CN 2011100490416A CN 201110049041 A CN201110049041 A CN 201110049041A CN 102103676 A CN102103676 A CN 102103676A
Authority
CN
China
Prior art keywords
java program
guarded
demon
pid
java
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.)
Granted
Application number
CN2011100490416A
Other languages
English (en)
Other versions
CN102103676B (zh
Inventor
王汝传
李伟
李鹏
张伟
孙力娟
黄海平
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing Post and Telecommunication University
Original Assignee
Nanjing Post and Telecommunication University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Nanjing Post and Telecommunication University filed Critical Nanjing Post and Telecommunication University
Priority to CN2011100490416A priority Critical patent/CN102103676B/zh
Publication of CN102103676A publication Critical patent/CN102103676A/zh
Application granted granted Critical
Publication of CN102103676B publication Critical patent/CN102103676B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)
  • Debugging And Monitoring (AREA)

Abstract

基于进程间继承关系的爪哇程序进程守护方法是一种在windows系统(一种操作系统的名称)中,针对爪哇程序(使用爪哇编程语言开发的程序,以下称java程序)进行守护的方法。主要用来解决被守护的java程序进程的鉴别和确定,并对该java程序的运行状态进行监控,防止其意外终止运行,该方法在被守护的爪哇程序进程与守护程序进程之间建立一种父子继承关系,并基于这种继承关系由守护程序进程来唯一确定被守护的爪哇程序进程;基于被守护的爪哇程序进程的内核对象状态确定被守护的爪哇程序的运行状态。

Description

一种基于进程间继承关系的爪哇程序进程守护方法
技术领域
本发明是一种在windows系统(一种操作系统的名称)中,针对爪哇程序(使用爪哇编程语言开发的程序,以下称java程序)进行守护的方法。主要用来解决被守护的java程序进程的鉴别和确定,并对该java程序的运行状态进行监控,防止其意外终止运行,属于计算软件安全技术领域。
背景技术
在windows下运行的一个应用程序可能会异常退出,这种退出并非程序当初设计时的意愿,引起这种异常退出可能是程序自身内部的错误,或者是被其他程序强行终止,也可能是非法用户执行退出操作。这些情况下,程序往往需要被重新启动才能实现其功能或向外提供服务。对于无人值守的服务器或者是后台运行的服务程序,用户并不能及时重新启动他们;对于计算机系统中的杀毒软件或者防火墙等安全产品而言,如果有程序或用户恶意结束它们,将会对系统安全造成一定的损失甚至严重后果。此时就需要一种机制能够实施实时监控,一旦检测到被守护的程序退出,就立即启动它,这就是进程守护技术。但是作为一种安全辅助手段,这种检测机制不能对系统本身的性能产生明显的影响,否则就会影响保护的被守护程序的服务效果,失去辅助程序的意义。
一般地,windows下正在运行的一个应用程序对应着一个进程,该进程由两部分构成:操作系统用于管理目的的进程内核对象和该进程所拥有的一个地址空间。其中内核对象是windows系统中最重要的概念之一,进程的内核对象只是所有内核对象中的一种。内核对象的用途非常广泛,其中之一便是可以用来进行同步。这些内核对象中的每一种要么处于触发状态,要么处于未触发状态。关于进程内核对象,微软公司为其指定了一些规则,规定如何在这两种状态之间进行转换。进程内核对象在进程创建的时候总是处于未触发状态,当进程终止的时候,操作系统就会自动使进程内核对象变成触发状态,并且当进程内核对象被触发以后,它将永远保持这种状态,再也回不到未触发状态。在进程内核对象的内部有一个布尔变量,当系统创建进程时,将此进程内核对象的布尔变量初始化为FALSE(表示未触发);当进程终止的时候,操作系统又会将这个布尔变量设为TRUE(表示已经被触发)。基于此,可以编写程序来测试一个进程内核对象的状态,以确定该进程是否正在运行。windows已经提供了相关的API(应用程序编程接口)用于检查进程内核对象的布尔值,而且将调用该线程设置为等待状态,直到被守护的进程内核对象从FALSE变为TRUE的时候自动唤醒等待的线程继续运行。
java语言(爪哇编程语言)是目前最流行的编程语言之一,其特点之一便是编译一次到处运行,现在已经成为许多应用方便的首选编程语言。在windows下,一个应用程序的磁盘文件一般即为一个可直接运行的exe文件(一种可执行文件的称呼)。但由于生成exe文件总要和系统的硬件平台相关,这和java的跨平台性是相悖的,所以java语言并不支持直接产生一个可执行的exe文件。一个GUI(图形化用户接口)应用程序,在开发过程中,可以使用java class文件(开发过程中的一种文件形式)来运行程序,但是最后发布应用程序的时候一般需将若干个class文件打包成一种jar文件(java档案文件),而不直接产生如windows下的exe文件,这些jar文件可以像exe那样双击运行。jar文件本身只是java文档的一种文档格式。在windows下安装JRE(Java运行环境)的时候,系统已经将该文件类型关联到javaw.exe(运行java程序时具体的执行文件)程序上,即双击该文件时实际是启动一个javaw.exe来打开jar文件并运行程序功能,在操作系统中具体表现为一个叫javaw.exe的进程。因此如果系统中有多个打包为jar的GUI应用程序同时在运行,也就运行了多个javaw.exe的进程,从任务管理器中会看到多个名字都为javaw.exe的进程实例在运行。
传统进程守护方法分析:
现有的进程守护方法如图1。该方法在运行过程中每隔一定时间查询系统当前运行的进程实例,具体操作是对当前系统拍快照,对所得的数据结构,通过匹配被守护进程的名字从而确定系统中是否有被守护进程正在运行。这种方法要求不停的查询系统,这将会消耗大量的系统资源。虽然将查询频率设定为一定的间隔可以减少查询次数从而降低对系统资源的占用。但是在对java应用程序进行守护的时候,是无法通过匹配被守护进程名字来确定被守护进程是否存在的。因为当系统中有多个Java程序在同时运行时,可能会出现多个javaw.exe的进程。这些进程对应着系统中同一个javaw.exe文件,它是打开jar格式文件实现应用程序功能的实体,通过这种简单的查询法方法并不能确定哪个javaw.exe对应被守护程序,也就不能确定被守护应用程序是否正在运行。因此传统的进程守护方法在这种情况下失效了。
还有一种方法是由需要被守护的程序自身来创建远程线程,病毒木马常使用这种方法,具体是在应用程序自身启动时,准备好远程线程所需的代码和数据,然后通过在其他进程中分配内存空间并将这些代码和数据写到远程进程中,然后启动远程线程,由该远程线程执行进程守护的功能。这种方法在windows下现在容易被杀毒软件误报为病毒或者被主动防御拦截,从而影响用户的体验性,而且这种将代码写到其他进程的方法会影响其他进程的稳定性。所以这种方法应该是一个正常应用程序尽量避免的方法。另外这一套方案一般是在windows平台上是使用c/c++(编程开发语言)开发应用程序时才有可能使用的。如果被守护的应用程序的是使用java编程语言写的,那么这种方案显然是不合适的。
发明内容
技术问题:本发明的目的是提供一种在windows环境下对被打包成jar格式的java程序实现进程守护的方法。该方法不仅减少了资源消耗量,提高主程序的健壮性,而且具有使用灵活,方便升级的特点。
技术方案:本发明是利用父进程和子进程之间的一一对应关系,在原有进程查询机制的基础上获得对应于被守护的java程序的进程信息,并借助被守护的java程序进程内核对象的状态来监视该java程序的运行状态。
父进程和子进程:
在设计应用程序时,有时需要启动多任务执行其他操作,同时本身的操作还继续进行。要这样做可以创建另一个本地线程,在该线程中执行其他操作,这就是多线程程序。但在有的场合下这样做并不合适,如需要进程守护时。一个线程监视它所处的进程运行状态是不合适的,因为如果进程意外终止了,那么进程之中执行守护的线程还没有来得及反应就随主进程的终止而结束了,也就无法实现进程守护的功能。另一方面,处在同一进程中的多个线程访问的是同一个进程地址空间,如果其中一个线程不经意地修改了重要内容会导致一些意想不到的结果。同时进程守护的功能跟应用程序的主体功能关联性并不大,所以可以将它独立出去放到另一个单独的进程中去完成守护任务,提高整体的健壮性。由于主体应用部分使用java语言开发,为简化操作它只需简单的启动另一个可执行文件,由该进程专门实现守护任务,然后主体程序专心实现自己的任务。只要保证守护进程的名字不变,内部实现则和主体部分没有关系,这样就可以使用windows系统下功能强大的各种API来实现守护功能,不仅提高模块化,而且使用起来更加灵活,也方便升级。
标识进程:
在windows下一个进程启动后,系统会给它分配一个标识符即PID(进程标识符),PID是一个DWORD(一种数据类型名称)类型的数据,并且系统保证在该进程运行期间,这个PID是和该进程一一对应的,即不会有其他进程拥有一样的PID,所以可以通过PID来唯一标识一个正在运行的进程。windows提供了API函数接口来获得当前进程的PID,即GetCurrentProcessld()。同时windows还提供了另一套功能强大的函数库Toolhelp32库(windows操作系统提供的一组开发包)来帮助获得当前系统正在运行的应用程序的信息,其工作机制是windows系统为所有当前在系统内存中的进程、线程以及模块等的当前状态信息制作了一个只读副本,即系统快照,系统用户通过访问该系统快照,进行某种类型信息的匹配就可以实现对被守护进程的当前状态的检测。快照实际上是一个个PROCESSENTRY32(一种数据结构名称)类型的数据结构,每个结构对应一个进程,包含了该进程的各种信息,在这里使用th32ProcessID和th32ParentProcessID(数据结构的名称)字段,这两个字段之间即表示了两个进程之间的继承关系。借助ToolHelp32库中的各种函数不仅可以获取进程快照,而且对于堆、模块和线程的系统快照同样可以获取。这里枚举进程只需用如下三个API函数:CreateToolhelp32Snapshot()、Process32First()和Process32Next()。第一步是用CreateToolhelp32Snapshot()函数创建系统信息“快照”。这个函数可以让你选择存储在快照中的信息类型。这里只是对进程信息感兴趣,因此只要包含TH32CS_SNAPPROCESS(一种预先定义的宏)标志即可。CreateToolhelp32Snapshot()函数返回一个HANDLE(一种标识符),完成调用之后,必须将此HANDLE传给CloseHandle(),关闭对该HANDLE的引用,这样系统才能释放相关资源。接下来调用Process32First()函数,从快照中获取进程信息,然后可以重复调用Process32Next,直到函数返回FALSE为止,这两个函数都带两个参数,它们分别是快照句柄和一个PROCESSENTRY32结构。调用这个两个函数就可以获得一个进程的信息,然后就可以匹配信息查看是否是被守护进程。在这些系统设施的基础上,执行一定的流程就可以确定被守护的java程序进程的PID,也就确定了对应于被守护的爪哇程序的javaw.exe进程,而不是面对多个不确定的javaw.exe进程。
获取进程内核对象状态:
对被守护的爪哇程序进程的运行状态进行监视,可以通过监视其进程的内核对象状态来实现。在windows中内核对象是某种数据结构,只能由内核访问,所以应用程序不能直接访问内核对象,只能通过一系列的函数接口来操纵这些数据结构。在32位的系统中,系统使用一个32位的值即句柄来标识一个对象。调用访问或者创建内核对象的函数后,函数会返回一个句柄,使用这个句柄即意味着对它所标识的对象进行某种操作。如果已经知道被守护进程的PID,就可以借助windows API函数HANDLE OpenProcess()获得该进程对象的HANDLE,然后就可以使用这个HANDLE来访问对应的内核对象获知它的状态,要使用的API函数为WaitForSingleObject()。其函数原型为:DWORD WaitForSingleObject(HANDLEhHandle,DWORD dwMilliseconds),hHandle为要监视的内核对象的句柄;dwMilliseconds为hHandle对象所设置的超时值,单位为毫秒。当在某一线程中调用该函数时,线程暂时挂起,系统监视hHandle所指向的对象的状态。如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变触发状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成触发状态,函数也返回。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE(一个预定义的宏)。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为触发状态,这里是要一直等待直到被守护进程对象变为触发状态,所以设置为INFINITE。
方法流程:
该方法在被守护的爪哇程序进程与守护程序进程之间建立一种父子继承关系,并基于这种继承关系由守护程序进程来唯一确定被守护的爪哇程序进程;基于被守护的爪哇程序进程的内核对象状态确定被守护的爪哇程序的运行状态;
a.基于父子继承关系确定被守护的爪哇程序进程的方法为:
步骤a1).被守护的爪哇程序进程启动守护程序进程,这样被守护的爪哇程序进程为父进程,守护程序进程成为被守护的爪哇程序进程的子进程,在这两个进程之间建立一种继承关系,一个子进程只有一个父进程,由守护程序进程来唯一确定被守护的爪哇程序进程;
步骤a2).守护程序进程获得自身进程标识符PID,该PID在守护程序进程运行期间唯一地标识守护程序进程,使用进程名字标识一个进程并不准确,系统中同时运行多个同名的进程,要获得守护程序进程的PID使用系统应用程序编程接口即可,这样做有利于提高程序的移植性;
步骤a3).守护程序进程对系统拍快照,快照是操作系统为所有当前运行的进程、线程的当前信息状态制作的一个只读副本,具体表现为一组数据结构,其中的每个结构又包含各个成员数据,这些成员含有进程名字、进程执行路径、进程PID和父进程PID信息,使用windows操作系统提供的函数库Toolhelp32获取系统快照;
步骤a4).守护程序进程从系统快照中找到包含守护程序进程信息的数据结构,在上一步骤获得的一组数据结构中,守护进程需要搜索其中的每个数据结构,将其中的PID成员字段和守护程序进程在步骤a2)中获得的自身PID进行匹配,一旦匹配即找到包含守护程序进程信息的数据结构;
步骤a5).保存父进程PID即被守护的爪哇程序进程PID,在包含守护程序进程信息的数据结构中有一个成员记录着守护程序进程的父进程PID,这个PID唯一地标识被守护的爪哇程序进程,这样就不必担心操作系统中同时有多个爪哇程序进程在运行,将该父进程PID值提取并保存起来;
b.基于被守护的爪哇程序进程的内核对象状态确定被守护的爪哇程序的运行状态的方法为:
步骤b1).守护程序进程根据保存的父进程PID通过系统的应用程序编程接口打开被守护的爪哇程序进程,应用程序编程接口会返回一个句柄,该句柄标识被守护的爪哇程序进程的内核对象,使用该句柄即意味着对被守护的爪哇程序进程的操作;
步骤b2).守护程序进程将步骤b1中返回的爪哇程序进程内核对象句柄传给应用程序编程接口来访问被守护的爪哇程序进程,这时守护程序进程进入阻塞状态,直到被守护的爪哇程序进程内核对象被触发才继续执行;
步骤b3).当被守护的爪哇程序进程不在运行时,操作系统触发该进程的内核对象,守护程序进程继续执行,这时守护程序进程重新启动被守护的爪哇程序;
步骤b4).守护程序进程自身退出运行,至此它已经完成守护任务,由它重新启动的爪哇程序运行后会启动一个新的守护程序进程,整个执行流程转到步骤a1)。
有益效果:
1.准确确定被守护进程
在系统中有多个javaw.exe在运行时,本发明克服了传统方法使用进程名匹配确定被守护进程的弊端,能够准确确定被守护java程序实例的javaw.exe进程。
3.简化整体系统的设计
把进程守护功能部分和主体功能部分分离,因此主体应用程序不必关心守护进程的实现细节,这种模块化的设计简化了整个应用系统的开发。
3.提高性能
本发明没有使用传统方法的频繁查询机制,而是用了一种内核状态等待机制,该机制告诉系统在等待期间,不需要给该进程分配CPU(中央处理器)时间,节约了宝贵的CPU时间,避免了大量系统资源消耗,提高了性能。
4.提高健壮性
守护进程独立为一个执行体,也使得彼此的错误不会相互影响,使整个系统具有很好的健壮性。
5.使用灵活,方便升级
主体程序只要简单的启动本程序即可实现进程守护功能,而不必关心其他事务,使用起来非常方便灵活。如果进程守护模块以后需要升级,只要保证最终生成的执行文件名不变,对原有程序没有任何影响,而如果主体系统升级,只要一直使用约定的文件名即可,这样做保持了良好的接口性,方便系统升级。
附图说明
图1是现有的进程守护方法。
图中Sleep()过程是设定查询操作的间隔时间,该方法先每隔一定的时间执行查询以找到被守护进程的信息;接着,再每隔一定的时间查询该进程的状态码。这种反复查询机制重复许多一样的步骤,效率低下,需要消耗大量系统资源。
图2是本发明的整体框架结构。
被守护的java程序启动守护程序进程,建立一种父子关系;被守护的java程序停止运行后,守护程序进程立即启动它。
图3是具体实施流程图。
从图中可以看出本发明的流程是线性执行的,没有返回的流程,这是和图1中方法的不同,没有重复操作,因此效率和性能都很好;在执行过程中使用进程PID而不是进程名字来标识父进程,准确识别被守护的java程序进程。
具体实施方式
本发明由被守护的java程序启动实现守护功能的守护程序,守护程序运行后开始对其父进程也就是被守护的java程序进程进行监视,整体框架如图2,具体流程如下:
该方法在被守护的爪哇程序进程与守护程序进程之间建立一种父子继承关系,并基于这种继承关系由守护程序进程来唯一确定被守护的爪哇程序进程;基于被守护的爪哇程序进程的内核对象状态确定被守护的爪哇程序的运行状态;
a.基于父子继承关系确定被守护的爪哇程序进程的方法为:
步骤a1).被守护的爪哇程序进程启动守护程序进程,这样被守护的爪哇程序进程为父进程,守护程序进程成为被守护的爪哇程序进程的子进程,在这两个进程之间建立一种继承关系,一个子进程只有一个父进程,由守护程序进程来唯一确定被守护的爪哇程序进程;
步骤a2).守护程序进程获得自身进程标识符PID,该PID在守护程序进程运行期间唯一地标识守护程序进程,使用进程名字标识一个进程并不准确,系统中同时运行多个同名的进程,要获得守护程序进程的PID使用系统应用程序编程接口即可,这样做有利于提高程序的移植性;
步骤a3).守护程序进程对系统拍快照,快照是操作系统为所有当前运行的进程、线程的当前信息状态制作的一个只读副本,具体表现为一组数据结构,其中的每个结构又包含各个成员数据,这些成员含有进程名字、进程执行路径、进程PID和父进程PID信息,使用windows操作系统提供的函数库Toolhelp32获取系统快照;
步骤a4).守护程序进程从系统快照中找到包含守护程序进程信息的数据结构,在上一步骤获得的一组数据结构中,守护进程需要搜索其中的每个数据结构,将其中的PID成员字段和守护程序进程在步骤a2)中获得的自身PID进行匹配,一旦匹配即找到包含守护程序进程信息的数据结构;
步骤a5).保存父进程PID即被守护的爪哇程序进程PID,在包含守护程序进程信息的数据结构中有一个成员记录着守护程序进程的父进程PID,这个PID唯一地标识被守护的爪哇程序进程,这样就不必担心操作系统中同时有多个爪哇程序进程在运行,将该父进程PID值提取并保存起来;
b.基于被守护的爪哇程序进程的内核对象状态确定被守护的爪哇程序的运行状态的方法为:
步骤b1).守护程序进程根据保存的父进程PID通过系统的应用程序编程接口打开被守护的爪哇程序进程,应用程序编程接口会返回一个句柄,该句柄标识被守护的爪哇程序进程的内核对象,使用该句柄即意味着对被守护的爪哇程序进程的操作;
步骤b2).守护程序进程将步骤b1中返回的爪哇程序进程内核对象句柄传给应用程序编程接口来访问被守护的爪哇程序进程,这时守护程序进程进入阻塞状态,直到被守护的爪哇程序进程内核对象被触发才继续执行;
步骤b3).当被守护的爪哇程序进程不在运行时,操作系统触发该进程的内核对象,守护程序进程继续执行,这时守护程序进程重新启动被守护的爪哇程序;
步骤b4).守护程序进程自身退出运行,至此它已经完成守护任务,由它重新启动的爪哇程序运行后会启动一个新的守护程序进程,整个执行流程转到步骤a1)。
为方便描述,假定如下应用场景:在使用java开发的软件系统设计时有对主体应用程序守护的系统需求,并且该系统最终以jar格式发布给用户使用,名字为usertest.jar,同时约定实现守护进程的执行文件名为prokeeper.exe(名字不是一定的,可以根据需要改变),其存放路径为C:\WINDOWS\prokeeper.exe(也可以将其放于别的路径下,使用对应的路径即可),为了简单起见这里假定usertest.jar和prokeeper.exe位于同一目录下,执行流程如图3,具体实施方式如下:(1)在java的源代码中,一般是初始化阶段,添加Runtime.getRuntime().exec方法,并将路径C:\WINDOWS\prokeeper.exe传给它,即:Runtime.getRuntime().exec(″C:\WINDOWS\prokeeper.exe″);
(2)用户双击usertest.jar运行java应用程序,这时系统会启动一个javaw.exe进程运行应用程序功能。这个javaw.exe进程即为要保护的进程,添加了(1)中的代码后它会启动守护进程prokeeper.exe。
(3)prokeeper.exe进程启动后,首先使用API GetCurrentProcessld()获得它自己PID,这里将它保存到DWORD类型的变量selfPID中,这个值在程序运行期间唯一标识prokeeper.exe进程;然后使用APICreateToolhelp32Snapshot()创建一个当前系统快照,获得一个快照句柄;接着将快照句柄和PROCESSENTRY32类型的内存空间传给API Process32First()获得快照中第一个进程信息结构,将其中的PID字段和刚才获得的selfPID匹配,如果匹配则找到了prokeeper.exe的进程信息,快照遍历结束,否则继续调用APIProcess32Next()获得下一个进程信息结构,再将其中的PID字段和刚才的selfPID匹配,直至找到能匹配的一个进程信息结构,然后保存其中的th32ParentProcessID字段(即父进程的PID),这里保存到DOWRD类型的变量paraPID中。至此已经确定了需要守护的进程PID即对应于usertest.jar的javaw.exe进程PID。
(4)在得到一个正在运行的进程PID之后,就可以用该PID访问该进程对象了。这个API函数是OpenProcess(),这里的调用形式为OpenProcess(PROCESS_ALL_ACCESS,FALSE,paraPID),该函数返回paraPID标识的进程内核对象的句柄paraH即对应于usertest.jar的javaw.exe进程内核对象,注意第一个参数必须为PROCESS_ALL_ACCESS,否则无法获得相应的访问权限导致监视内核对象状态失败。获得进程内核对象的句柄之后,就可以使用等待函数使守护进程处于等待状态直到指定的内核对象被触发,即等待对应于usertest.jar的javaw.exe进程结束,那时相应进程内核对象被触发。等待函数API为WaitForSingleObject(),在这里第一个参数为paraH,表示等待该对象被触发,第二个参数为INFINIT,这告诉系统,调用进程愿意永远等待,没有超时时间。一旦对应于usertest.jar的javaw.exe进程结束,其进程内核对象被触发,这时WaitForSingleObject()返回,守护进程prokeeper.exe从等待状态唤醒。这时可以对WaitForSingleObject()的返回值进程判断,如果等于WAIT_OBJECT_0,说明等待的内核对象被触发即对应于usertest.jar的javaw.exe进程结束了。
(5)当对应于usertest.jar的javaw.exe进程结束了,守护进程就需要马上重新启动该usertest.jar应用程序。在windows中启动一个jar程序就和启动一个exe程序类似,可以使用API ShellExecute()来实现,第一个参数、第四个参数和第五个参数设为NULL,第二个参数为″open″表示对文件执行打开操作,第三个参数为要启动的文件路径,这里已经假定在同一目录下为″.\\usertest.jar″,最后一个参数设为SW_SHOWNORMAL表示正常显示程序。最后守护进程就退出,usertest.jar启动后,执行流程又转到步骤(2)。

Claims (1)

1.一种基于进程间继承关系的爪哇程序进程守护方法,其特征在于该方法在被守护的爪哇程序进程与守护程序进程之间建立一种父子继承关系,并基于这种继承关系由守护程序进程来唯一确定被守护的爪哇程序进程;基于被守护的爪哇程序进程的内核对象状态确定被守护的爪哇程序的运行状态;
a.基于父子继承关系确定被守护的爪哇程序进程的方法为:
步骤a1).被守护的爪哇程序进程启动守护程序进程,这样被守护的爪哇程序进程为父进程,守护程序进程成为被守护的爪哇程序进程的子进程,在这两个进程之间建立一种继承关系,一个子进程只有一个父进程,由守护程序进程来唯一确定被守护的爪哇程序进程;
步骤a2).守护程序进程获得自身进程标识符PID,该PID在守护程序进程运行期间唯一地标识守护程序进程,使用进程名字标识一个进程并不准确,系统中同时运行多个同名的进程,要获得守护程序进程的PID使用系统应用程序编程接口即可,这样做有利于提高程序的移植性;
步骤a3).守护程序进程对系统拍快照,快照是操作系统为所有当前运行的进程、线程的当前信息状态制作的一个只读副本,具体表现为一组数据结构,其中的每个结构又包含各个成员数据,这些成员含有进程名字、进程执行路径、进程PID和父进程PID信息,使用windows操作系统提供的函数库Toolhelp32获取系统快照;
步骤a4).守护程序进程从系统快照中找到包含守护程序进程信息的数据结构,在上一步骤获得的一组数据结构中,守护进程需要搜索其中的每个数据结构,将其中的PID成员字段和守护程序进程在步骤a2)中获得的自身PID进行匹配,一旦匹配即找到包含守护程序进程信息的数据结构;
步骤a5).保存父进程PID即被守护的爪哇程序进程PID,在包含守护程序进程信息的数据结构中有一个成员记录着守护程序进程的父进程PID,这个PID唯一地标识被守护的爪哇程序进程,这样就不必担心操作系统中同时有多个爪哇程序进程在运行,将该父进程PID值提取并保存起来;
b.基于被守护的爪哇程序进程的内核对象状态确定被守护的爪哇程序的运行状态的方法为:
步骤b1).守护程序进程根据保存的父进程PID通过系统的应用程序编程接口打
开被守护的爪哇程序进程,应用程序编程接口会返回一个句柄,该句柄标识被守护的爪哇程序进程的内核对象,使用该句柄即意味着对被守护的爪哇程序进程的操作;
步骤b2).守护程序进程将步骤b1中返回的爪哇程序进程内核对象句柄传给应用程序编程接口来访问被守护的爪哇程序进程,这时守护程序进程进入阻塞状态,直到被守护的爪哇程序进程内核对象被触发才继续执行;
步骤b3).当被守护的爪哇程序进程不在运行时,操作系统触发该进程的内核对象,守护程序进程继续执行,这时守护程序进程重新启动被守护的爪哇程序;
步骤b4).守护程序进程自身退出运行,至此它已经完成守护任务,由它重新启动的爪哇程序运行后会启动一个新的守护程序进程,整个执行流程转到步骤a1)。
CN2011100490416A 2011-02-28 2011-02-28 一种基于进程间继承关系的爪哇程序进程守护方法 Expired - Fee Related CN102103676B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2011100490416A CN102103676B (zh) 2011-02-28 2011-02-28 一种基于进程间继承关系的爪哇程序进程守护方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2011100490416A CN102103676B (zh) 2011-02-28 2011-02-28 一种基于进程间继承关系的爪哇程序进程守护方法

Publications (2)

Publication Number Publication Date
CN102103676A true CN102103676A (zh) 2011-06-22
CN102103676B CN102103676B (zh) 2013-09-25

Family

ID=44156434

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2011100490416A Expired - Fee Related CN102103676B (zh) 2011-02-28 2011-02-28 一种基于进程间继承关系的爪哇程序进程守护方法

Country Status (1)

Country Link
CN (1) CN102103676B (zh)

Cited By (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102331950A (zh) * 2011-09-15 2012-01-25 北京安天电子设备有限公司 基于Linux定时任务的守护进程实现方法和系统
CN102436404A (zh) * 2011-08-24 2012-05-02 苏州阔地网络科技有限公司 一种进程守护方法
CN102999412A (zh) * 2012-11-21 2013-03-27 浪潮电子信息产业股份有限公司 一种Linux下进程监护的方法
CN103825752A (zh) * 2012-11-19 2014-05-28 中国银联股份有限公司 用于监控系统运行状态的装置及方法
CN103886249A (zh) * 2012-12-20 2014-06-25 腾讯科技(深圳)有限公司 系统超级用户权限下执行进程的方法及装置
CN103902383A (zh) * 2014-03-26 2014-07-02 浪潮电子信息产业股份有限公司 一种基于继承机制的资源管理器设计方法
CN104919415A (zh) * 2013-01-08 2015-09-16 韩奥科技有限公司 用于管理应用程序的装置和方法
CN105516926A (zh) * 2016-01-13 2016-04-20 广东欧珀移动通信有限公司 一种网络定位方法、装置及移动终端
CN106020958A (zh) * 2016-05-17 2016-10-12 北京金山安全软件有限公司 一种获取文件占用进程的方法、装置及电子设备
CN106874126A (zh) * 2017-01-24 2017-06-20 厦门天锐科技股份有限公司 一种软件开发中主进程异常检测方法
CN106874077A (zh) * 2015-12-11 2017-06-20 腾讯科技(深圳)有限公司 进程运行方法及装置
CN106933658A (zh) * 2015-12-29 2017-07-07 北京明朝万达科技股份有限公司 一种操作系统中后台进程防杀死的方法和装置
CN107729213A (zh) * 2017-10-11 2018-02-23 杭州迪普科技股份有限公司 一种后台任务监控方法及装置
CN107741894A (zh) * 2016-11-25 2018-02-27 腾讯科技(深圳)有限公司 一种应用进程的监控方法和装置
CN108459868A (zh) * 2018-03-29 2018-08-28 武汉斗鱼网络科技有限公司 一种软件启动方法、装置、终端和存储介质
CN110659491A (zh) * 2019-09-23 2020-01-07 深信服科技股份有限公司 一种计算机系统恢复方法、装置、设备及可读存储介质
CN111078540A (zh) * 2019-11-29 2020-04-28 四川九洲空管科技有限责任公司 基于qt开发通用航空飞行服务软件内存异常检测定位方法
CN111290949A (zh) * 2020-01-21 2020-06-16 上海悦易网络信息技术有限公司 一种进程守护方法及设备
CN112114955A (zh) * 2020-09-28 2020-12-22 广州锦行网络科技有限公司 Windows平台下实现单进程单线程完成端口的方法
CN113326520A (zh) * 2021-06-11 2021-08-31 北京天融信网络安全技术有限公司 访问控制过程中确定主体的方法、装置、设备和存储介质
CN114816546A (zh) * 2022-04-28 2022-07-29 合肥高维数据技术有限公司 客户端应用程序多重保活方法及系统

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20030167421A1 (en) * 2002-03-01 2003-09-04 Klemm Reinhard P. Automatic failure detection and recovery of applications
CN1489049A (zh) * 2002-10-11 2004-04-14 华为技术有限公司 一种对后台程序进行监控的方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20030167421A1 (en) * 2002-03-01 2003-09-04 Klemm Reinhard P. Automatic failure detection and recovery of applications
CN1489049A (zh) * 2002-10-11 2004-04-14 华为技术有限公司 一种对后台程序进行监控的方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
《信息技术》 20051130 董冰等 "面向Java语言的代码安全" , 第11期 *

Cited By (29)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102436404A (zh) * 2011-08-24 2012-05-02 苏州阔地网络科技有限公司 一种进程守护方法
CN102436404B (zh) * 2011-08-24 2013-08-14 苏州阔地网络科技有限公司 一种进程守护方法
CN102331950B (zh) * 2011-09-15 2017-02-22 北京安天电子设备有限公司 基于Linux操作系统定时任务的守护进程实现方法和系统
CN102331950A (zh) * 2011-09-15 2012-01-25 北京安天电子设备有限公司 基于Linux定时任务的守护进程实现方法和系统
CN103825752A (zh) * 2012-11-19 2014-05-28 中国银联股份有限公司 用于监控系统运行状态的装置及方法
CN103825752B (zh) * 2012-11-19 2018-04-27 中国银联股份有限公司 用于监控系统运行状态的装置及方法
CN102999412A (zh) * 2012-11-21 2013-03-27 浪潮电子信息产业股份有限公司 一种Linux下进程监护的方法
CN103886249A (zh) * 2012-12-20 2014-06-25 腾讯科技(深圳)有限公司 系统超级用户权限下执行进程的方法及装置
US9819664B2 (en) 2012-12-20 2017-11-14 Tencent Technology (Shenzhen) Company Limited Method and device for implementing a process under a superuser privilege, and mobile terminal
CN104919415A (zh) * 2013-01-08 2015-09-16 韩奥科技有限公司 用于管理应用程序的装置和方法
CN103902383A (zh) * 2014-03-26 2014-07-02 浪潮电子信息产业股份有限公司 一种基于继承机制的资源管理器设计方法
CN106874077B (zh) * 2015-12-11 2020-04-21 腾讯科技(深圳)有限公司 进程运行方法及装置
CN106874077A (zh) * 2015-12-11 2017-06-20 腾讯科技(深圳)有限公司 进程运行方法及装置
CN106933658A (zh) * 2015-12-29 2017-07-07 北京明朝万达科技股份有限公司 一种操作系统中后台进程防杀死的方法和装置
CN105516926A (zh) * 2016-01-13 2016-04-20 广东欧珀移动通信有限公司 一种网络定位方法、装置及移动终端
CN105516926B (zh) * 2016-01-13 2018-03-27 广东欧珀移动通信有限公司 一种网络定位方法、装置及移动终端
CN106020958A (zh) * 2016-05-17 2016-10-12 北京金山安全软件有限公司 一种获取文件占用进程的方法、装置及电子设备
CN107741894A (zh) * 2016-11-25 2018-02-27 腾讯科技(深圳)有限公司 一种应用进程的监控方法和装置
CN106874126A (zh) * 2017-01-24 2017-06-20 厦门天锐科技股份有限公司 一种软件开发中主进程异常检测方法
CN107729213A (zh) * 2017-10-11 2018-02-23 杭州迪普科技股份有限公司 一种后台任务监控方法及装置
CN107729213B (zh) * 2017-10-11 2022-04-26 杭州迪普科技股份有限公司 一种后台任务监控方法及装置
CN108459868A (zh) * 2018-03-29 2018-08-28 武汉斗鱼网络科技有限公司 一种软件启动方法、装置、终端和存储介质
CN110659491A (zh) * 2019-09-23 2020-01-07 深信服科技股份有限公司 一种计算机系统恢复方法、装置、设备及可读存储介质
CN111078540A (zh) * 2019-11-29 2020-04-28 四川九洲空管科技有限责任公司 基于qt开发通用航空飞行服务软件内存异常检测定位方法
CN111290949A (zh) * 2020-01-21 2020-06-16 上海悦易网络信息技术有限公司 一种进程守护方法及设备
CN112114955A (zh) * 2020-09-28 2020-12-22 广州锦行网络科技有限公司 Windows平台下实现单进程单线程完成端口的方法
CN113326520A (zh) * 2021-06-11 2021-08-31 北京天融信网络安全技术有限公司 访问控制过程中确定主体的方法、装置、设备和存储介质
CN113326520B (zh) * 2021-06-11 2023-07-04 北京天融信网络安全技术有限公司 访问控制过程中确定主体的方法、装置、设备和存储介质
CN114816546A (zh) * 2022-04-28 2022-07-29 合肥高维数据技术有限公司 客户端应用程序多重保活方法及系统

Also Published As

Publication number Publication date
CN102103676B (zh) 2013-09-25

Similar Documents

Publication Publication Date Title
CN102103676B (zh) 一种基于进程间继承关系的爪哇程序进程守护方法
US7278057B2 (en) Automated hang detection in Java thread dumps
US8166464B2 (en) Analysis and detection of soft hang responsiveness program errors
US5778230A (en) Goal directed object-oriented debugging system
US20240078116A1 (en) Just-in-Time Containers
CN101553769A (zh) 用于跟踪并监控计算机应用的系统和方法
WO2002021269A1 (en) Software application development
Bodden et al. Aspect-oriented race detection in Java
US20210208954A1 (en) Lock-free reading of unitary value sets
Gordon et al. Java UI: effects for controlling UI object access
Dietrich et al. Global optimization of fixed-priority real-time systems by RTOS-aware control-flow analysis
Schneider et al. Migration of automotive real-time software to multicore systems: First steps towards an automated solution
Kim et al. Dual execution for on the fly fine grained execution comparison
US20180089440A1 (en) Method and system for runtime instrumentation of software methods
US20150293953A1 (en) Robust, low-overhead, application task management method
Kristensen et al. Model-based development of a course of action scheduling tool
Zhong et al. Inferring specifications of object oriented APIs from API source code
Liu et al. PF-Miner: A practical paired functions mining method for Android kernel in error paths
Molyakov Token scanning as a new scientific approach in the creation of protected systems: A new generation OS MICROTEK
Entrup et al. ARA: Automatic Instance-Level Analysis in Real-Time Systems
Tchamgoue et al. Lightweight labeling scheme for on-the-fly race detection of signal handlers
Minh Do et al. A divide & conquer approach to testing concurrent Java programs with JPF and Maude
Baur Instrumenting Java bytecode to replay execution traces of multithreaded programs
US8135943B1 (en) Method, apparatus, and computer-readable medium for generating a dispatching function
Zhong BINGO: Pinpointing Concurrency Bugs in Go via Binary Analysis

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
EE01 Entry into force of recordation of patent licensing contract

Application publication date: 20110622

Assignee: Jiangsu Nanyou IOT Technology Park Ltd.

Assignor: NANJING University OF POSTS AND TELECOMMUNICATIONS

Contract record no.: 2016320000220

Denomination of invention: Method for protecting Java program progress based on inheritance relationship among progresses

Granted publication date: 20130925

License type: Common License

Record date: 20161121

LICC Enforcement, change and cancellation of record of contracts on the licence for exploitation of a patent or utility model
EC01 Cancellation of recordation of patent licensing contract
EC01 Cancellation of recordation of patent licensing contract

Assignee: Jiangsu Nanyou IOT Technology Park Ltd.

Assignor: NANJING University OF POSTS AND TELECOMMUNICATIONS

Contract record no.: 2016320000220

Date of cancellation: 20180116

CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20130925