जावा से Syscalls मंगवाएं


12

वहाँ जावा से सीधे syscalls आह्वान करने का एक तरीका है, या पहले एक देशी विधि को कॉल करना आवश्यक है?

जवाबों:


11

आपको एक मूल विधि का उपयोग करने की आवश्यकता है, लेकिन आपको इसे स्वयं लागू करने की आवश्यकता नहीं है। जावा में JNI पर एक भिन्नता है, जिसे JNA (जावा नेटिव एक्सेस) कहा जाता है , जो आपको उनके आसपास लिपटे एक JNI इंटरफ़ेस की आवश्यकता के बिना साझा किए गए पुस्तकालयों को सीधे एक्सेस करने देता है, इसलिए आप इसका उपयोग सीधे 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");
    }
}

दिलचस्प है, क्या संख्याओं के बजाय फ़ंक्शन नामों का उपयोग करना संभव है?
मैकशलेपजिग

1
syscallइंटरफ़ेस में @ max ? नहीं, syscallC पक्ष की तरह, उपयुक्त कॉल का प्रतिनिधित्व करने के लिए एक पूर्णांक लेता है। का एक समूह रहे हैं #defineमें /usr/include/asm/unistd.hकी तरह, #define __NR_mkdir 39यह सी समारोह बुला लोगों के लिए आसान बनाने के लिए, लेकिन मैं वहाँ स्वचालित रूप से जावा में आयात करने के लिए कोई रास्ता नहीं है नहीं लगता है, आप उन सभी अपने आप को परिभाषित करने के लिए होगा
माइकल Mrozek

2
कृपया सावधान रहें - x86 और x86-64 पर संख्याएँ लिनक्स पर भिन्न हैं।
मैकीज पीचोटका

@Maciej अच्छा बिंदु, जवाब में एक चेतावनी जोड़ा
माइकल Mrozek

शानदार जवाब भाई! आपकी सहायता के लिए धन्यवाद। यहाँ से मेरा एक और सवाल है। मैं इसे एक मिनट में पूछूंगा।
santiago.basulto

2

एक देशी विधि, या एक पुस्तकालय का उपयोग करना आवश्यक है जो आपके लिए ऐसा करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.