अस्वीकरण: प्रश्न के लेखक Erlang औसत ज्ञान और सी का बुनियादी ज्ञानसी और Erlang: Erlang पोर्ट उदाहरण
मैं अब Interoperability Tutorial User Guide पढ़ रहा हूँ है। मैंने complex.c
उदाहरण सफलतापूर्वक संकलित किया है और यह बिना किसी समस्या के एरलांग पोर्ट के साथ काम करता है।
हालांकि, मैं समझना चाहता हूं कि वास्तविक सी कोड कैसे काम करता है। मैं इसे सामान्य रूप से समझता हूं: उदाहरण में यह मानक इनपुट से 2 बाइट पढ़ता है और पहले बाइट को चेक करता है। पहले बाइट के आधार पर यह foo
या bar
फ़ंक्शन पर कॉल करता है। यह अभी मेरी समझ की सीमा है।
तो, हम ले अगर दोनों erl_comm.c
:
/* erl_comm.c */
typedef unsigned char byte;
read_cmd(byte *buf)
{
int len;
if (read_exact(buf, 2) != 2)
return(-1);
len = (buf[0] << 8) | buf[1];
return read_exact(buf, len);
}
write_cmd(byte *buf, int len)
{
byte li;
li = (len >> 8) & 0xff;
write_exact(&li, 1);
li = len & 0xff;
write_exact(&li, 1);
return write_exact(buf, len);
}
read_exact(byte *buf, int len)
{
int i, got=0;
do {
if ((i = read(0, buf+got, len-got)) <= 0)
return(i);
got += i;
} while (got<len);
return(len);
}
write_exact(byte *buf, int len)
{
int i, wrote = 0;
do {
if ((i = write(1, buf+wrote, len-wrote)) <= 0)
return (i);
wrote += i;
} while (wrote<len);
return (len);
}
और port.c
:
/* port.c */
typedef unsigned char byte;
int main() {
int fn, arg, res;
byte buf[100];
while (read_cmd(buf) > 0) {
fn = buf[0];
arg = buf[1];
if (fn == 1) {
res = foo(arg);
} else if (fn == 2) {
res = bar(arg);
}
buf[0] = res;
write_cmd(buf, 1);
}
}
क्या प्रत्येक कार्य वास्तव में वहाँ क्या करता है? li, len, i, wrote, got
चर क्या वास्तव में सेवा करते हैं?
कुछ और छोटे सवाल:
- क्यों कार्यों किसी भी वापसी प्रकार की जरूरत नहीं है, यहां तक कि
void
रों? - जब एरलांग पोर्ट सी को डेटा भेजता है, तो पहला बाइट एक फ़ंक्शन कहलाता है। यदि बाइट दशमलव 1 रखता है, तो
foo()
कहा जाता है, यदि बाइट दशमलव 2 रखता है, तोbar()
कहा जाता है। यदि किसी भी तरह से परिवर्तित नहीं किया गया है तो इस प्रोटोकॉल का उपयोग केवल 25 पैरामीटर के साथ 255 अलग-अलग सी कार्यों को कॉल करने के लिए किया जा सकता है। क्या वह सही है? - "लम्बा संकेतक जोड़ना एरलांग बंदरगाह द्वारा स्वचालित रूप से किया जाएगा, लेकिन बाहरी सी प्रोग्राम में स्पष्ट रूप से किया जाना चाहिए"। इसका क्या मतलब है? कोड की किस पंक्ति पर यह किया जाता है?
- ट्यूटोरियल से: "डिफ़ॉल्ट रूप से, सी प्रोग्राम मानक इनपुट (फ़ाइल डिस्क्रिप्टर 0) से पढ़ना चाहिए और मानक आउटपुट (फ़ाइल डिस्क्रिप्टर 1) को लिखना चाहिए।" फिर: "ध्यान दें कि stdin और stdout buffered इनपुट/आउटपुट के लिए हैं और Erlang के साथ संचार के लिए उपयोग नहीं किया जाना चाहिए!" यहां कैच क्या है?
- क्यों
buf
[100]
पर शुरू किया गया है?
'buf' के बारे में आपकी धारणा सही है। यह एक सरणी है, यानी, एक निर्दिष्ट स्मृति क्षेत्र निर्दिष्ट निर्दिष्ट प्रकार के तत्वों को पकड़ने में सक्षम है। इस परिदृश्य में ढेर पर आवंटित स्मृति। स्मृति आवंटित करने का एक अलग तरीका 'पॉफ' को पॉइंटर बनाना होगा और इसे 'मॉलोक' का उपयोग करके ढेर पर आवंटित करना होगा (लेकिन फिर आपको यह सुनिश्चित करना होगा कि जब आप इसके साथ काम करेंगे तो स्मृति को मुक्त करें)। –
के बारे में 4. पहले ट्यूटोरियल का कहना है कि सी प्रोग्राम stdin (फ़ाइल descriptor 0) से पढ़ना चाहिए और stdout (फ़ाइल descriptor 1) को लिखना चाहिए। फिर ट्यूटोरियल का कहना है कि एरडैंग के साथ संचार के लिए stdin/stdout का उपयोग नहीं किया जाना चाहिए। "क्या यह प्रत्यक्ष विरोधाभास नहीं है? वे एक उदाहरण सी प्रोग्राम प्रदान करते हैं जो stdin/stdout का उपयोग करता है और फिर वे कहते हैं कि इसका उपयोग नहीं किया जाना चाहिए, क्योंकि stdin/stdout buffered है। मुझे लगता है कि मुझे कुछ याद आती है। – skanatek
@ मार्टिनली - ओह, सच है, मुझे लगता है। मैंने इसका मतलब यह लिया कि आपको इन बंदरगाहों का उपयोग एरलांग और सी प्रक्रियाओं के बीच आगे और आगे संचार करने के लिए नहीं करना चाहिए (यही कारण है कि सी नोड चीज के लिए है)। हम हालांकि नहीं हैं; एरलांग एक अनुरोध भेज रहा है और कार्यक्रम के प्रति आमंत्रण की एक 'इंट' प्रतिक्रिया की उम्मीद कर रहा है। मुझे लगता है कि मुझे गलत समझा या गलत तरीके से पढ़ा जा सकता है। – Inaimathi