1

JavaのRuntime.getRuntime()。exec()コマンドを介して起動されるプロセスのPIDを取得する必要があります。

私は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 ???;
}

誰かが私を助けてくれるといいですね。LinuxのPIDは[プロセス]フィールドから取得できるため、私は主にWindowsソリューションを探していますが、Linux/Solarisでもこれを行う方法を誰かに教えてもらってもかまいません。

事前にどうもありがとうございました!

4

2 に答える 2

2

とった。それは使用するのと同じくらい簡単でした:

#define WINVER 0x0501
#define _WIN32_WINNT 0x0501

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

助けようとしたすべての人に感謝します:-)

于 2013-03-16T16:52:30.377 に答える
1

役に立つかもしれないこのページを見つけました-http: //golesny.de/p/code/javagetpid。さまざまなプラットフォームで外部プロセスのPIDを抽出するためのコードを提供します...いくつかの方法で。

要約すれば:

  • を使用RuntimeMXBeanして、実行中のすべてのプロセスを一覧表示し、パターンマッチングを使用して、PIDを検索しようとしているプロセスの名前に一致するプロセスを選択できます。(しかし、落とし穴は、プロセス名が一意ではないということです...)

  • Linux / UNIXでは、リフレクションを使用してXxxProcessオブジェクトからPIDを取得できます。

  • Windowsでは、JNAを使用してPIDを取得する必要があります。これを行うためのいくつかのコードは、リンクされたページにあります。


もし私がこれをしていたら、私は別のアプローチを取ると思います。外部コマンド(またはラッパー/ランチャー)でPIDを把握し、親JVMが読み取れる場所に書き込むことができるかどうかを確認します。

于 2013-03-10T08:26:13.273 に答える