Richiama Syscalls da Java


12

C'è un modo per invocare syscalls direttamente da Java o è necessario prima chiamare un metodo nativo?

Risposte:


11

È necessario utilizzare un metodo nativo, ma non è necessario implementarlo da soli. Java ha una variante su JNI chiamata JNA (Java Native Access) , che ti consente di accedere direttamente alle librerie condivise senza bisogno di un'interfaccia JNI racchiusa tra loro, quindi puoi usarla per interfacciarsi direttamente con glibc:

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

interessante, è possibile usare nomi di funzioni anziché numeri?
maxschlepzig,

1
@max Nell'interfaccia syscall? No, syscallrichiede un numero intero per rappresentare la chiamata appropriata da effettuare, proprio come sul lato C. Ci sono un sacco di messaggi #definedentro /usr/include/asm/unistd.h, come #define __NR_mkdir 39per rendere più facile per le persone che chiamano la funzione C, ma non penso che ci sia alcun modo per importarli automaticamente in Java, dovresti definirli tutti da soli
Michael Mrozek

2
Attenzione: i numeri su x86 e x86-64 sono diversi su Linux.
Maciej Piechotka,

@Maciej Un buon punto, ha aggiunto un avvertimento nella risposta
Michael Mrozek

Grande risposta fratello! Grazie per l'aiuto. Da qui ho un'altra domanda. Lo chiederò tra un minuto.
santiago.basulto

2

È necessario utilizzare un metodo nativo o una libreria che lo fa per te.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.