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);
}