Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.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 system()是否避免使用fork_Java_Runtime_Exec_Jna - Fatal编程技术网

Java JNA system()是否避免使用fork

Java JNA system()是否避免使用fork,java,runtime,exec,jna,Java,Runtime,Exec,Jna,我试图找到一种不使用fork的Java Runtime.exec()替代方法。问题是JVM消耗了大部分内存,并且该进程上的Runtime.exec fork可能会导致内存问题,即使是写时拷贝和overwit(这在stackoverflow中经常讨论,请参阅) 在另一篇stackoverflow文章中,有人建议使用JNA解决方案,但对此解决方案没有任何评论,也没有得到高度评价: 同样,这里也提出了类似的JNA解决方案: 我的问题是:使用JNA进行系统调用是否会阻止fork,以及它是否会避免fork

我试图找到一种不使用fork的Java Runtime.exec()替代方法。问题是JVM消耗了大部分内存,并且该进程上的Runtime.exec fork可能会导致内存问题,即使是写时拷贝和overwit(这在stackoverflow中经常讨论,请参阅)

在另一篇stackoverflow文章中,有人建议使用JNA解决方案,但对此解决方案没有任何评论,也没有得到高度评价:

同样,这里也提出了类似的JNA解决方案:

我的问题是:使用JNA进行系统调用是否会阻止fork,以及它是否会避免fork可能导致的后续内存分配问题?以下是我正在使用的代码:

public class TestJNA {
 private interface CLibrary extends Library {
    CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class);
    int system(String cmd);
 }
 private static int exec(String command) {
    return CLibrary.INSTANCE.system(command);
 }
 public static void main(String[] args) {
    exec("ls");
 }
不,需要做一个(或等效的),而JNA对此无能为力

我不认为人们建议您使用JNA调用
系统
,而是执行实际的系统调用。例如,该博客给出了
chmod
chown
作为示例。因此,使用您的示例,而不是使用JNA调用
system('ls')
,而是调用
opendir
readdir
(当然,这同样适用于您真正调用的任何东西)


您可能需要创建一个DLL来包装所需的功能。

如果没有fork(),就不可能执行“系统”。

可能没有。您正在调用的
system()
的实现几乎肯定是使用
fork()
本身——C实现看起来像:

int system(const char *cmd) {
    if (fork() == 0) {
        execl("/bin/sh", "-c", cmd);
        _exit(1);
    }
    int result;
    wait(&result);
    return WEXITSTATUS(result);
}
一个更可行的解决方案是维护与小型外部流程的通信线路(例如,管道),该外部流程可以为您生成子流程。Android做的事情非常像这样;外部过程被称为“受精卵”。那么system()是如何工作的呢?如果它仍然使用叉子? 我遇到了一个错误“java.io.IOException:error=12,无法分配内存” 这为我解决了这个问题:

private interface CLibrary extends Library {
            CLibrary INSTANCE = (CLibrary) Native.loadLibrary(("c"), CLibrary.class);
        int system(String cmd);
    }

    private static int exec(String command) {
        return CLibrary.INSTANCE.system(command);
    }

感谢您关于使用小型外部流程的建议。我正在使用ucspi tcp中的tcpserver来侦听来自Java的套接字连接。tcpserver为我生成了shell进程。工作起来很有魅力,可以让我的记忆更具可预测性。如果您使用TCP,请确保它只能在本地访问,并且不会暴露于权限级别较低的进程。