1

POSIX フォークを使用して、実行中の JVM のクローンを作成しようとしています。フォークにアクセスする方法は、JNI (つまりhttps://github.com/kohsuke/akuma/blob/master/src/main/java/com/sun/akuma/CLibrary.java ) を使用することです。フォークの後、親と子の両方で計算を行ってから終了したいと思います。

以下はテストコードです。分岐後、「After the fork.」という行が 2 行表示されますが、これは親と子の両方がこの時点に到達したことを意味します。ただし、親プロセスは正常に終了しますが、子プロセスは終了しません。

さらに、端末のシグナル15で子プロセスを強制終了できません。子 JVM プロセスを強制終了するには、kill -9 を使用する必要があります。

何が間違っている可能性がありますか?

import static com.sun.akuma.CLibrary.LIBC;

public class ForkTest {
    public static void main(String[] args) {
        int pid = LIBC.fork();
        if (pid == 0) {
            System.out.println("This is the child.");
        } else {
            System.out.println("This is the parent. child pid=" + pid);
        }
        System.out.println("After the fork.");
    }
}
4

1 に答える 1

0

@Awaken この記事http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-themによると、マルチスレッドアプリケーションをフォークすると、 fork() を呼び出したスレッドだけが生きたままになります。スレッドは死ぬ。すべてのスレッドを失うと、子でスナップショットを達成できないと思います。

于 2015-04-05T08:58:41.903 に答える