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?

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");
    }
}

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.