为什么简单地使用JNA会在Mac OS X上导致fork()?

时间:2012-07-18 16:00:22

标签: java macos fork jna

以下是使用JNA库在Java中创建硬链接的简单方法:

import com.sun.jna.Library;
import com.sun.jna.Native;
import java.io.File;
import java.io.IOException;

public final class HardLink {

    private static final LibC LIBC = (LibC)Native.loadLibrary("c", LibC.class);

    private HardLink() {
    }

    public static void link(File src, File dest) throws IOException {
        if (LIBC.link(src.toString(), dest.toString()) != 0)
            throw new IOException(LIBC.strerror(Native.getLastError()));
    }

    public static void main(String[] args) throws Exception {
        System.out.println("Attempting to hardlink " + args[0] + " -> " + args[1]);
        HardLink.link(new File(args[0]), new File(args[1]));
    }

    private interface LibC extends Library {
        int link(String from, String to);
        String strerror(int errno);
    }
}

当使用JNA 3.4.0在Mac OS X 10.7.4(Lion)上运行此程序时,它确实有效,但由于某种原因,它正在执行fork() - 我说这是因为它导致了Java图标,弹出窗口(显示)在任务栏中,命令栏中带有“HardLink”作为程序名称。

我的问题是:为什么JNA会做fork()(或者是它)?这个程序有什么问题吗?

注意:我对从Java硬链接文件的其他方式不感兴趣。这只是一个例子。

1 个答案:

答案 0 :(得分:3)

JNA会加载一些AWT类,除非你正在运行无头。这是加载与AWT相关的类(包括Swing),导致java进程出现在OSX Dock中。

使用-Djava.awt.headless = true运行程序。这样可以防止它出现在OSX底座中。