2009-12-23 14 views
5

ट्यूटोरियल में पर उपलब्ध कराई: http://www.erlang.org/doc/tutorial/cnode.htmlErlang सी नोड संबंधित प्रश्न

निम्न उदाहरण है:


/* cnode_s.c */ 
#include 
#include 
#include 
#include 
#include "erl_interface.h" 
#include "ei.h" 
#define BUFSIZE 1000 
int main(int argc, char **argv) { 
    int port;        /* Listen port number */ 
    int listen;        /* Listen socket */ 
    int fd;         /* fd to Erlang node */ 
    ErlConnect conn;       /* Connection data */ 
    int loop = 1;       /* Loop flag */ 
    int got;         /* Result of receive */ 
    unsigned char buf[BUFSIZE];    /* Buffer for incoming message */ 
    ErlMessage emsg;       /* Incoming message */ 
    ETERM *fromp, *tuplep, *fnp, *argp, *resp; 
    int res; 
    port = atoi(argv[1]); 
    erl_init(NULL, 0); 
    if (erl_connect_init(1, "secretcookie", 0) == -1) 
    erl_err_quit("erl_connect_init"); 
    /* Make a listen socket */ 
    if ((listen = my_listen(port))

मुझे लगता है कि erl_receive_msg एक अवरुद्ध कॉल है, और मैं कैसे पता नहीं है इसे दूर करो। सी नेटवर्क प्रोग्रामिंग में "चयन" कथन है लेकिन एरलांग ईआई एपीआई में मुझे नहीं पता कि ऐसा कोई कथन है या नहीं।

मूल रूप से मैं एक सी नोड, कि लगातार Erlang नोड से संदेश भेजता है का निर्माण करना चाहते। सादगी के लिए मान लीजिए कि केवल एक एरलांग नोड है।

एरलांग नोड को सी नोड से प्राप्त संदेशों को संसाधित करना होता है। Erlang नोड यह सुनिश्चित करने के लिए नहीं है कि इसे संदेश प्राप्त हुआ है, न कि इसे प्रसंस्करण के परिणाम के साथ जवाब देना है। इसलिए संदेश भेजने के बाद मुझे विश्वास की परवाह नहीं है।

एक सोच सकते हैं एक के रूप में कोड को संशोधित कर सकता है कि:

... 
if (emsg.type == ERL_REG_SEND) { 
    ... 
    while(1) { 
     //generate tuple 
     erl_send(fd, fromp, tuple); 
     //free alloc resources 
    } 
    ... 
} 

यह एक अनंत लूप जिसमें हम उत्पादन और (भेज) का उपभोग संदेशों का उत्पादन करेगा। लेकिन एक महत्वपूर्ण समस्या है: यदि मैं ऐसा करता हूं, तो सी नोड एरलांग नोड को बहुत अधिक संदेश भेज सकता है (इसलिए एरलंग नोड से सी नोड को धीमा करने के लिए संदेश भेजने का एक तरीका होना चाहिए), या Erlang नोड सोच सकता है कि सी नोड नीचे है।

मुझे पता है कि सवाल होना चाहिए कम एक सूट (इस लंबी और बदसूरत है), लेकिन संक्षेप:

क्या तंत्र (प्रक्रिया कॉल, एल्गोरिथ्म) एक एक के लिए सी में एक उत्सुक निर्माता विकसित करने के लिए उपयोग कर सकते हैं Erlang में आलसी उपभोक्ता, जैसे कि दोनों पार्टियां अंतर्निहित संदर्भ से अवगत हैं?

उत्तर

2

मैं पोर्ट ड्राइवर अपने आप को मामले आप का वर्णन कर रहे हैं के लिए उपयोग (सी नोड्स छुआ है क्योंकि मैं नहीं बल्कि अधिक decoupling होगा)। EPAPI:

Erlang के लिए पोर्ट चालक पुस्तकालय पर एक नज़र डालें। एक परियोजना है जो इस पुस्तकालय को लेती है: Erland DBus

+0

समस्या यह है कि निर्माता सी नोड होगा और एरलांग नोड उपभोक्ता होगा। मैंने एक बंदरगाह का उपयोग करने का विचार माना है, लेकिन एक सतत लूप में फोन करना बंदरगाह चालक की सेवा ऐसा करने का सबसे अच्छा तरीका प्रतीत नहीं होता है। – user237855

+0

@ ज़लमॉक्सिस: इस स्थिति को हल करने के कई अलग-अलग तरीके हैं, जिनमें से एक "टोकन आधारित क्रेडिट एल्गोरिदम" का उपयोग करना हो सकता है। "उपभोक्ता नोड" निर्माता नोड को "क्रेडिट" भेजता है। प्रत्येक "भेजने" के लिए "क्रेडिट" की आवश्यकता होती है: जब कोई और नहीं होता है, तो "निर्माता" को क्रेडिट के अगले "वितरण" के लिए प्रतीक्षा करनी होगी। – jldupont

+0

@ ज़लमॉक्सिस: ऊपर वर्णित "टोकन आधारित शेपर" आसानी से "निर्माता" पक्ष (सी में लिखा गया) पर आसानी से कार्यान्वित किया जा सकता है, जबकि यह इस योजना के लिए एरलांग पक्ष पर समर्थन जोड़ने के लिए समान रूप से छोटा है। चूंकि आप पहले से ही "सी नोड्स" का उपयोग करके "दर्द" के लिए हैं, तो मुझे पता है कि आप पोर्ट ड्राइवर्स ले सकते हैं। चीयर्स और मजा करो! (किसी भी तरह, हमेशा के रूप में, मेरे योगदान के लिए एक सुझाव के रूप में मेरे योगदान पर विचार करें)। – jldupont

1

क्या आपने ei_receive_msg_tmo फ़ंक्शन की जांच की है? मुझे लगता है कि यह Erlang के निर्माण के बाद प्राप्त करने के समान काम करता है, इसलिए यदि आप 0 से टाइमआउट सेट करते हैं, तो यह गैर-अवरुद्ध होगा।

मेरा मानना ​​है कि erl_interface को बहिष्कृत किया गया है, और इसके बजाय ईआई का उपयोग किया जाना चाहिए। यह एक पूर्ण गलत सूचना है, हालांकि हो सकता है ...

+0

धन्यवाद, मैं वर्तमान में इसका परीक्षण कर रहा हूं। कृपया ध्यान दें कि टाइमआउट 0 के साथ ei_receive_msg_tmo को कॉल करके यह अवरुद्ध हो जाएगा। – user237855

+0

ठीक है। तो स्पष्ट रूप से गैर-टाइमआउट फ़ंक्शन एमएस = 0 के साथ टाइमआउट में वापस आते हैं। यही कारण है कि ms = 0 अवरुद्ध हो जाता है (देखें ei_read_t() फ़ंक्शन erl_interface/src/misc/ei_portio.c)। मैं इसे कार्यक्षमता पर आलस्य की जीत कहूंगा :) – Zed

1

आप ट्यूटोरियल लिंक है कि आप पोस्ट को करीब से देख लेने की जरूरत। ("और अंततः हमारे पास सी नोड क्लाइंट के लिए कोड है।") आप देखेंगे कि लेखक ने क्लाइंट सीएनओडी कार्यान्वयन प्रदान किया है। यह तर्कसंगत दिखता है।