类进程守护(fork)

2016-07-08  本文已影响49人  同一错误不能犯两次

注意: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();
}
上一篇 下一篇

猜你喜欢

热点阅读