Java的Process下的destroy会发出什么signal

绪论

做安卓系统的时候,我们需要使用Java调用某些native的程序,比如logcat,或者cat或者一些其他自己写的程序。
在某些情况下,我们通过Process的一个对象去执行了那个程序,然后通过destroy让它停止运行。这个时候我们希望在这个native程序收到signal的时候做一些处理,保存数据什么的。这个时候我们就需要知道destroy发出了什么signal了。

先说结论,destroy 发出的是 SIGTERM 信号,如果是Linux系统,就是 kill -15 PID 的时候向该进程发出的信号。

验证

我们用下面的代码来验证:
首先编写一个native的程序

#include<stdio.h>
#include<signal.h>
#include<unistd.h>
int isbreak=0;
FILE* inf;

void sigint_handler(int sig)
{
    printf("sig=%d",sig);
    fprintf(inf,"sig=%d\n",sig);
    isbreak=1;
}

int main()
{
    signal(SIGINT,sigint_handler);
    signal(SIGTERM,sigint_handler);
    inf = fopen("/home/dada/code/signaltest/oooo.txt","w+");
    while(!isbreak)
    {
         fprintf(inf,"hahaa\n");
         sleep(1);
    }
    fclose(inf);
    return 0;
}

上面的代码会向oooo.txt每隔1s写入一行hahaa,结束的时候会向文件写入sig=xxx
编译它。然后编写一个简单的Java程序来调用它

public class ppp{
    public static void main(String[] args){
        String cmd="/home3/dada/code/signaltest/a.out ";
        try{
            Process p=Runtime.getRuntime().exec(cmd);
            Thread.sleep(10000);
            p.destroy();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

运行这个java程序之后可以看到oooo.txt的内容:

hahaa
hahaa
hahaa
hahaa
hahaa
hahaa
hahaa
hahaa
hahaa
hahaa
hahaa
sig=15

原因

这里可以从jdk的源码中得到。UNIXProcess_md.c

JNIEXPORT void JNICALL
Java_java_lang_UNIXProcess_destroyProcess(JNIEnv *env, jobject junk, jint pid)
{
    kill(pid, SIGTERM);
}

参考链接:Java - Process.destroy() source code for Linux

posted @ 2020-01-04 18:10  SupperMary  阅读(996)  评论(0编辑  收藏  举报