Rufen Sie Syscalls von Java aus auf

12

Gibt es eine Möglichkeit, Syscalls direkt von Java aus aufzurufen, oder muss zuerst eine systemeigene Methode aufgerufen werden?

santiago.basulto
quelle

Antworten:

11

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");
    }
}
Michael Mrozek
quelle
Interessant, ist es möglich, Funktionsnamen anstelle von Zahlen zu verwenden?
maxschlepzig 06.09.10
1
@max In der syscallSchnittstelle? Nein, es syscallwird eine Ganzzahl verwendet, um den entsprechenden Aufruf zu repräsentieren, genau wie auf der C-Seite. Es gibt eine Reihe von #defines in /usr/include/asm/unistd.h, wie #define __NR_mkdir 39es 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
Michael Mrozek
2
Bitte beachten Sie, dass die Nummern unter x86 und x86-64 unter Linux unterschiedlich sind.
Maciej Piechotka 06.09.10
@Maciej Guter Punkt, fügte eine Warnung in der Antwort hinzu
Michael Mrozek
Tolle Antwort, Bruder! Danke für Ihre Hilfe. Von hier aus habe ich eine andere Frage. Ich werde es gleich fragen.
santiago.basulto
2

Es ist erforderlich, eine native Methode oder eine Bibliothek zu verwenden, die dies für Sie erledigt.

margulies
quelle