Gibt es eine Möglichkeit, Syscalls direkt von Java aus aufzurufen, oder muss zuerst eine systemeigene Methode aufgerufen werden?
Gibt es eine Möglichkeit, Syscalls direkt von Java aus aufzurufen, oder muss zuerst eine systemeigene Methode aufgerufen werden?
Antworten:
Sie müssen eine native Methode verwenden, diese jedoch nicht selbst implementieren. Java hat eine JNI-Variante namens JNA (Java Native Access) , mit der Sie direkt auf gemeinsam genutzte Bibliotheken zugreifen können, ohne dass eine JNI-Schnittstelle um diese herum gewickelt werden muss.
import com.sun.jna.Library;
import com.sun.jna.Native;
public class Test {
public interface CStdLib extends Library {
int syscall(int number, Object... args);
}
public static void main(String[] args) {
CStdLib c = (CStdLib)Native.loadLibrary("c", CStdLib.class);
// WARNING: These syscall numbers are for x86 only
System.out.println("PID: " + c.syscall(20));
System.out.println("UID: " + c.syscall(24));
System.out.println("GID: " + c.syscall(47));
c.syscall(39, "/tmp/create-new-directory-here");
}
}
syscall
Schnittstelle? Nein, es syscall
wird eine Ganzzahl verwendet, um den entsprechenden Aufruf zu repräsentieren, genau wie auf der C-Seite. Es gibt eine Reihe von #define
s in /usr/include/asm/unistd.h
, wie #define __NR_mkdir 39
es einfacher zu machen für die Menschen dem Aufruf der C - Funktion, aber ich glaube nicht , dass es eine Möglichkeit, automatisch diejenigen in Java zu importieren, würden Sie haben sie alle selbst definieren