2010-10-29 17 views
12

ठीक है, यह एक बहुत ही रोचक सवाल है और ऐसा करने का कोई आसान तरीका नहीं हो सकता है लेकिन मुझे लगा कि मैं यह तय करने से पहले इसे बाहर फेंक दूंगा कि पर्ल संशोधित मेरा अंतर्निहित उत्तर है।एम्बेडेड सी अनुप्रयोग के भीतर पर्ल से कॉलिंग सी फ़ंक्शन

तो मुझे एक सी एप्लिकेशन मिला है जो एक एम्बेडेड फैशन में पर्ल स्क्रिप्ट को कॉल करता है। यह सब ठीक और बेवकूफ काम करता है और यह बहुत बढ़िया है कि मैं जानकारी पास कर सकता हूं और जानकारी वापस प्राप्त कर सकता हूं। फिर, अब मेरी अगली विजय पर; मुझे अपनी एम्बेडेड स्क्रिप्ट को सी एप्लिकेशन के भीतर कुछ फ़ंक्शंस कॉल करने में सक्षम होने की अनुमति देने की आवश्यकता है, जो मूल रूप से इसे कॉल किया गया है।

यह महत्वपूर्ण है क्योंकि XSUB को बाहरी पुस्तकालय होने की आवश्यकता होगी; लेकिन मैं नहीं चाहता कि यह बाहरी पुस्तकालय हो, मैं चाहता हूं कि यह सी फ़ंक्शन (ओं) को सीधा कॉल करे। अब शायद यह XSUB के माध्यम से किया जा सकता है और मैं बस इसे पढ़ रहा हूं और इसे गलत समझ रहा हूं।

Application -(run)-> Perl 

Application <-(function_x())- Perl 

Application -(returnfunction_x)-> Perl 

कारण यह बाहरी पुस्तकालय नहीं हो सकता है क्योंकि मैं उस डेटा पर भरोसा कर रहा हूं जो पूरी तरह से एप्लिकेशन के भीतर बनाया/संग्रहीत है।

+0

पायथन में ऐसा करने का तरीका सी में एक एफएफआई फ़ंक्शन बनाना है और फिर उसे वर्चुअल मॉड्यूल के शब्दकोश में जोड़ना है जो पायथन स्क्रिप्ट आयात करता है। सुनिश्चित नहीं है कि यह पर्ल में वैसे ही किया गया है। –

उत्तर

7

XSUBs वास्तव में बाहरी पुस्तकालय होने की आवश्यकता नहीं है। वे केवल पर्ल स्पेस से सी फ़ंक्शन पर कॉल करने की क्षमता प्रदान करते हैं, और सी और पर्ल के बीच कॉलिंग सम्मेलनों को मैप करने में कुछ सुविधा प्रदान करते हैं।

आपको केवल इतना करना है कि आप एम्बेड किए गए पर्ल दुभाषिया के साथ एम्बेडेड एप्लिकेशन में संकलित XSUBs पंजीकृत करें।

#include "XSUB.h" 

XS(XS_some_func); 
XS(XS_some_func) 
{ 
    dXSARGS; 
    char *str_from_perl, *str_from_c; 

    /* get SV*s from the stack usign ST(x) and friends, do stuff to them */ 
    str_from_perl = SvPV_nolen(ST(0)); 

    /* do your c thing calling back to your application, or whatever */ 
    str_from_c = some_c_func(str_from_perl); 

    /* pack up the c retval into an sv again and return it on the stack */ 
    mXPUSHp(c_str); 
    XSRETURN(1); 
} 

/* register the above XSUB with the perl interpreter after creating it */ 
newXS("Some::Perl::function", XS_some_func, __FILE__); 

जब पर्ल embedding, बात की इस तरह आम तौर पर xs_init समारोह आप parse_perl को पारित किया जाता है।

EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); 

static void 
xs_init (pTHX) 
{ 
    newXS("Some::Perl::function", XS_some_func, __FILE__); 
    /* possibly also boot DynaLoader and friends. perlembed has more 
    * details on this, and ExtUtils::Embed helps as well. */ 
    newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); 
} 

perl_parse(my_perl, xs_init, argc, my_argv, NULL); 

उसके बाद आप पर्ल अंतरिक्ष से Some::Perl::function रूप XSUB को कॉल करने के लिए सक्षम हो जाएगा, और बदले में कि XSUB किसी भी तरह से यह करना चाहता है में वापस अपने आवेदन करने के लिए कॉल करने के लिए स्वतंत्र है।

+0

तो क्या आपके द्वारा चिपकाया गया पहला अनुभाग एक .xs फ़ाइल में जाता है? – Suroot

+0

यह सी कोड है, इसलिए मैं इसे '.c' फ़ाइल में रखना चाहता हूं, लेकिन मुझे संदेह है कि किसी भी उचित सी कंपाइलर को उन फ़ाइलों के विस्तार के बारे में परवाह है जिन्हें आप संकलित करने के लिए कहते हैं :-) – rafl

+1

यह सब अब समझ में आता है; मैं सोच रहा था कि न्यूएक्सएस सामान वास्तव में मॉड्यूल लोड करने के बारे में बात कर रहा था। Perl-xs के बारे में अधिक दस्तावेज नहीं मिला; सबसे सराहनीय महोदय! – Suroot

संबंधित मुद्दे