Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么JNA的这种简单使用会导致Mac OS X上出现fork()?_Java_Macos_Fork_Jna - Fatal编程技术网

Java 为什么JNA的这种简单使用会导致Mac OS X上出现fork()?

Java 为什么JNA的这种简单使用会导致Mac OS X上出现fork()?,java,macos,fork,jna,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); priv

以下是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硬链接文件的其他方式不感兴趣。这只是一个例子。

JNA加载一些AWT类,除非您运行的是headless。加载AWT相关类(包括Swing)导致java进程出现在OSX Dock中


使用-Djava.awt.headless=true运行程序。这将阻止它显示在OSX dock中

为什么任务栏中显示的应用程序暗示它正在分叉?它会出现两次吗?我同意。您应该集中精力确定OSX dock可能会反弹新图标的所有原因,然后确定其中哪些是实际发生的。我想您可能会发现,启动任何加载AWT类的Java程序都可能会“碰撞”dock,并且您可能需要显式地在headless模式下运行,以避免JNA加载任何AWT类。我认为这是分叉的原因是,在我的实际程序中,反弹发生在程序实际启动后很久(当jna操作第一次发生时)。headless模式修复了它。