使用JNI运行进程的PID获取(Get PID of Runtime process using J

2019-10-17 19:06发布

我需要它通过Java的调用Runtime.getRuntime()启动的进程的PID。EXEC()命令。

我知道该怎么做,在JNA。 但我真的想和JNI这样做,并创建自己的图书馆。 有谁知道如何做到这一点?

import java.lang.reflect.Field;

class GetPid
{
    public native int getPid( long procHandle);

    static
    {
        System.loadLibrary("getpid");
    }

    public static void main(String args[])
    {
        try {

          Process process = Runtime.getRuntime().exec( "calc");
          Field f = process.getClass().getDeclaredField( "handle");
          f.setAccessible( true);
          long procHandle = f.getLong( process);

          System.out.println( "prochandle: " + procHandle + ", pid: " + new GetPid().getPid( procHandle));

        } catch( Exception e) {
          e.printStackTrace();
        }

    }
}

但是,什么是C部分,应该是什么样子的?

JNIEXPORT jint JNICALL
Java_GetPid_getPid(JNIEnv *env, jobject obj, jlong handle)
{
    ...

    return ???;
}

这将是巨大的,如果有人可以帮助我。 我主要是寻求Windows的解决方案,因为你可以从过程现场得到PID为Linux,但我不介意,如果有人能告诉我如何做到这一点在Linux / Solaris上为好。

非常感谢你提前!

Answer 1:

得到它了。 这是因为使用简单:

#define WINVER 0x0501
#define _WIN32_WINNT 0x0501

JNIEXPORT jint JNICALL
Java_GetPid_getPid(JNIEnv *env, jobject obj, jlong handle)
{
  return GetProcessId((HANDLE) handle);
}

感谢所有谁试图帮助:-)



Answer 2:

我找到了这个网页,可能是有用的- http://golesny.de/p/code/javagetpid 。 它使代码在一对夫妇的方式提取各种平台上的一个外部进程PID ...。

综上所述:

  • 您可以使用RuntimeMXBean列出所有正在运行的进程,然后使用模式匹配来挑选出其PID你正在努力寻找过程的名称相匹配的。 (但小问题,就是进程名称不是唯一的...)

  • 在Linux / UNIX可以钓鱼的PID出使用反射XxxProcess对象。

  • 在Windows中,您必须使用JNA得到PID。 一些代码来做到这一点是链接的页面上。


如果我这样做,我想我会采取不同的方法。 我想看看是否有可能得到的外部命令(或包装/发射器)想通的PID是什么,然后把它写入某个父JVM可以读取它。



文章来源: Get PID of Runtime process using JNI
标签: java runtime pid