Java'dan Syscalls'ı çağır


12

Sistem çağrılarını doğrudan Java'dan çağırmanın bir yolu var mı, yoksa önce yerel bir yöntemi çağırmak gerekli mi?

Yanıtlar:


11

Yerel bir yöntem kullanmanız gerekir, ancak bunu kendiniz uygulamanız gerekmez. Java, JNA (JNA (Java Native Access)) adında bir varyasyona sahiptir ;

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

ilginç, rakamlar yerine fonksiyon isimlerini kullanmak mümkün mü?
maxschlepzig

1
@max syscallArayüzde mi? Hayır, syscallC tarafında olduğu gibi yapmak için uygun çağrıyı temsil eden bir tamsayı alır. C işlevini çağıran insanlar için kolaylaştırmak gibi bir sürü #defines var , ancak bunları otomatik olarak Java'ya aktarmanın bir yolu olduğunu düşünmüyorum, hepsini kendiniz tanımlamanız gerekir/usr/include/asm/unistd.h#define __NR_mkdir 39
Michael Mrozek

2
Lütfen dikkat - x86 ve x86-64'teki sayılar Linux'ta farklıdır.
Maciej Piechotka

@Maciej İyi bir nokta, cevaba bir uyarı ekledi
Michael Mrozek

Harika Cevap kardeş! Yardımınız için teşekkürler. Buradan başka bir sorum daha olacak. Bir dakika içinde soracağım.
santiago.basulto

2

Yerel bir yöntem veya sizin için bunu yapan bir kütüphane kullanmak gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.