1

我正在尝试使用 POSIX fork 克隆正在运行的 JVM。我访问 fork 的方式是通过 JNI(即https://github.com/kohsuke/akuma/blob/master/src/main/java/com/sun/akuma/CLibrary.java)。在分叉之后,我希望父母和孩子都进行一些计算然后退出。

以下是测试代码。在fork之后,可以看到两行“After the fork.”,意思是parent和child都到了这个点。但是随后,父进程正常退出,而子进程没有。

此外,我无法在终端中使用信号 15 终止子进程。我必须使用 kill -9 来杀死子 JVM 进程。

知道可能出了什么问题吗?

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 回答