【问题标题】:Java - Process.destroy() source code for LinuxJava - Linux 的 Process.destroy() 源代码
【发布时间】:2012-05-24 17:02:33
【问题描述】:

我需要检查Process.destroy() 的代码,看看它在Linux 上kill 是一个子进程的确切程度。

有谁知道这个方法的作用或有它的来源的链接吗?我检查了jdk 源,Process 只是一个抽象类,destroy 方法尚未实现,似乎没有指向extendsimplementsProcess 的任何子类的链接。任何帮助将不胜感激。

谢谢,

【问题讨论】:

  • 它几乎肯定会调用kill(pid, SIGTERM)。为什么你认为你需要知道?

标签: java linux process kill


【解决方案1】:

进程管理和所有类似的操作都由操作系统完成。因此,JVM 必须调用适当的系统调用才能销毁进程。这显然会因操作系统而异。

在 Linux 上,我们有 kill 系统调用来执行此操作 - 如果我们想终止当前正在运行的进程,则使用 exit。当然,JDK 源代码中的本地方法是根据 JVM 将要运行的操作系统分开的。如前所述,Process 有一个public void destroy() 方法。在Linux的情况下,这个方法是由UNIXProcess实现的。 destroy() 方法是这样实现的:

private static native void destroyProcess(int pid);
public void destroy() {
    destroyProcess(pid);
}

本机方法destroyProcess() 又在UNIXProcess_md.c 中定义,如下所示:

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

其中kill 是Linux 系统调用,其源代码在Linux 内核中可用,更准确地说,在文件kernel/signal.c 中。它被声明为SYSCALL_DEFINE2(kill, pid_t, pid, int, sig)

阅读愉快! :)

【讨论】:

  • 请注意,至少在 OpenJDK 7 中,destroy 方法在调用destroyProcess 后也会关闭标准输入、标准输出和标准错误。
猜你喜欢
  • 2011-02-26
  • 2013-11-17
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多