类进程守护(fork)

注意:fork类进程守护只适合大部分4.3之前系统

这里需要解释下为什么4.3之前可行,之后不可行
在源码activitymanagerservice中

4.3之前代码为:

Process.killProcessQuiet(pid);

4.3之后代码为:

 Process.killProcessQuiet(app.pid);
 Process.killProcessGroup(app.info.uid, app.pid);

由于4.3之后谷歌管理进程通过了组的方式,fork出来的进程都会被分到一个组中,所以增加了killProcessGroup代码,杀掉当前组中的所有进程。


fork分析

参考链接:Linux中fork()函数详解

C代码

#include <jni.h>
#include <string.h>
#include <JNIDemo.h>
#include <android/log.h>
#include <unistd.h>


#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)//打印android日志
static char TAG[] = "Native.init"; //日志tag

jint Java_com_demo_ndk_so_JNIDemo_whileFork(JNIEnv * env, jobject thiz) {
int pid = fork();
if (0 == pid) //我是子进程
        {
    while (1) {
        //在这里面实现需要的逻辑,在android4.3之前的系统,程序关闭过后子进程不会被kill掉
        LOGD("儿子正在循环/n");
        sleep(1);
    }
} else if (0 > pid) //错误的fork
        {
    LOGD("error in fork!");
} else { //我是父进程
    LOGD("我是孩子他爹/n");
}
return 0;
}

JAVA代码

package com.demo.ndk.so;

public class JNIDemo {
static{
    System.loadLibrary("JNIDemo");
}
public static native int whileFork();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容