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.