Erlang 21 - 15. Ports and Port Drivers

15 पोर्ट और पोर्ट ड्राइवर




erlang

15 पोर्ट और पोर्ट ड्राइवर

पोर्ट और पोर्ट ड्राइवरों का उपयोग कैसे करें के उदाहरण Interoperability Tutorial । उल्लिखित बीआईएफ के बारे में जानकारी के लिए, ईआरटीएस में इरलैंग erlang(3) मैनुअल पेज देखें।

15.1 पोर्ट

बंदरगाह बाहरी दुनिया के साथ संचार के लिए बुनियादी तंत्र प्रदान करते हैं, एर्लांग के दृष्टिकोण से। वे बाहरी प्रोग्राम को बाइट-ओरिएंटेड इंटरफ़ेस प्रदान करते हैं। जब एक पोर्ट बनाया गया है, तो एरलंग बायनेरी सहित बाइट्स की सूची भेज और प्राप्त करके इसके साथ संवाद कर सकते हैं।

पोर्ट बनाने वाली Erlang प्रक्रिया को पोर्ट स्वामी या पोर्ट की कनेक्टेड प्रक्रिया कहा जाता है। पोर्ट से और उसके आसपास के सभी संचार पोर्ट मालिक के माध्यम से जाने चाहिए। यदि पोर्ट स्वामी समाप्त हो जाता है, तो पोर्ट (और बाहरी प्रोग्राम, यदि यह सही तरीके से लिखा गया है) करता है।

बाहरी प्रोग्राम किसी अन्य OS प्रक्रिया में रहता है। डिफ़ॉल्ट रूप से, यह मानक इनपुट (फ़ाइल डिस्क्रिप्टर 0) से पढ़ता है और मानक आउटपुट (फाइल डिस्क्रिप्टर 1) को लिखता है। पोर्ट बंद होने पर बाहरी प्रोग्राम को समाप्त करना है।

15.2 पोर्ट ड्राइवर

सी में एक ड्राइवर को कुछ सिद्धांतों के अनुसार लिखना संभव है और गतिशील रूप से इसे एरलंग रनटाइम सिस्टम से जोड़ते हैं। लिंक्ड-इन ड्राइवर Erlang प्रोग्रामर के दृष्टिकोण से एक बंदरगाह जैसा दिखता है और इसे पोर्ट ड्राइवर कहा जाता है।

चेतावनी

एक गलत पोर्ट ड्राइवर पूरे Erlang रनटाइम सिस्टम को मेमोरी, हैंग या क्रैश करने का कारण बनता है।

पोर्ट ड्राइवरों के बारे में जानकारी के लिए, ERTS में erl_driver(4) मैनुअल पेज, ERTS में driver_entry(1) मैनुअल पेज और कर्नेल में erl_ddll(3) मैनुअल पेज देखें।

15.3 पोर्ट बीआईएफ

पोर्ट बनाने के लिए:

open_port(PortName, PortSettings नए Erlang पोर्ट खोलने के परिणामस्वरूप पोर्ट पहचानकर्ता Port लौटाता है। संदेशों को एक पोर्ट आइडेंटिफ़ायर की तरह भेजा और प्राप्त किया जा सकता है, बिलकुल पिड की तरह। पोर्ट पहचानकर्ताओं को link/1 का उपयोग करके भी जोड़ा जा सकता है, या register/2 का उपयोग करके नाम के तहत पंजीकृत किया जा सकता है।

तालिका 15.1: पोर्ट क्रिएशन बीआईएफ

PortName आमतौर पर एक टपल {spawn,Command} , जहां स्ट्रिंग Command बाहरी प्रोग्राम का नाम है। बाहरी प्रोग्राम एरलांग कार्यक्षेत्र के बाहर चलता है, जब तक कि Command नाम वाला पोर्ट ड्राइवर नहीं मिलता है। यदि Command मिलती है, तो वह ड्राइवर शुरू हो जाता है।

PortSettings पोर्ट के लिए सेटिंग्स (विकल्पों) की एक सूची है। सूची में आम तौर पर कम से कम एक टपल {packet,N} , जो निर्दिष्ट करता है कि पोर्ट और बाहरी प्रोग्राम के बीच भेजा गया डेटा एन-बाइट लंबाई संकेतक से पहले है। N के लिए मान्य मान 1, 2 या 4 हैं। यदि बाइट्स की सूची के बजाय बायनेरिज़ का उपयोग किया जाना है, तो विकल्प binary को शामिल किया जाना चाहिए।

पोर्ट मालिक Pid संदेश भेजने और प्राप्त करने के लिए पोर्ट Port साथ संवाद कर सकता है। (वास्तव में, कोई भी प्रक्रिया संदेशों को पोर्ट पर भेज सकती है, लेकिन पोर्ट मालिक को संदेश में पहचाना जाना चाहिए)।

Erlang / OTP R16 के रूप में, बंदरगाहों को भेजे गए संदेश वास्तव में अतुल्यकालिक रूप से वितरित किए जाते हैं। अंतर्निहित कार्यान्वयन ने पहले संदेशों को समकालिक रूप से बंदरगाहों तक पहुंचाया। संदेश पासिंग को हमेशा अतुल्यकालिक ऑपरेशन के रूप में प्रलेखित किया गया है। इसलिए, यह बंदरगाहों के साथ संचार करने वाले एरलंग कार्यक्रम के लिए एक मुद्दा नहीं है, जब तक कि बंदरगाहों के बारे में गलत धारणाएं नहीं बनाई गई हैं।

उदाहरण के निम्नलिखित तालिकाओं में, Data एक I / O सूची होनी चाहिए। I / O सूची द्विआधारी या पूर्णांक की द्विआधारी या (संभवतः गहरी) सूची है। 0..255:

संदेश विवरण
{Pid,{command,Data}} पोर्ट के लिए Data भेजता है।
{Pid,close} पोर्ट बंद कर देता है। जब तक कि पोर्ट पहले से ही बंद नहीं हो जाता है, तब पोर्ट {Port,closed} साथ {Port,closed} जब सभी बफ़र्स फ्लश हो गए होते हैं और पोर्ट वास्तव में बंद हो जाता है।
{Pid,{connect,NewPid}} पोर्ट के पोर्ट मालिक को NewPid सेट करता है। जब तक पोर्ट पहले से ही बंद नहीं हो जाता, तब तक पोर्ट पुराने पोर्ट के मालिक के साथ {Port,connected} का जवाब देता है। ध्यान दें कि पुराना पोर्ट स्वामी अभी भी पोर्ट से जुड़ा हुआ है, लेकिन नया पोर्ट मालिक नहीं है।

तालिका 15.2: एक पोर्ट को भेजे गए संदेश

संदेश विवरण
{Port,{data,Data}} Data बाहरी प्रोग्राम से प्राप्त होता है।
{Port,closed} Port ! {Pid,close} को उत्तर दें Port ! {Pid,close} Port ! {Pid,close}
{Port,connected} Port ! {Pid,{connect,NewPid}} को उत्तर दें Port ! {Pid,{connect,NewPid}} Port ! {Pid,{connect,NewPid}}
{'EXIT',Port,Reason} यदि पोर्ट किसी कारण से समाप्त हो गया है।

तालिका 15.3: पोर्ट से प्राप्त संदेश

संदेश भेजने और प्राप्त करने के बजाय, कई बीआईएफ भी हैं जिनका उपयोग किया जा सकता है:

पोर्ट बीआईएफ विवरण
port_command(Port,Data) पोर्ट के लिए Data भेजता है।
port_close(Port) पोर्ट बंद कर देता है।
port_connect(Port,NewPid) पोर्ट के पोर्ट मालिक को NewPid सेट करता है। पुराने पोर्ट के मालिक Pid पोर्ट से जुड़े रहते हैं और यदि यह वांछित नहीं है तो unlink(Port) कॉल करना होगा।
erlang:port_info(Port,Item) Item द्वारा निर्दिष्ट जानकारी लौटाता है।
erlang:ports() वर्तमान नोड पर सभी बंदरगाहों की सूची लौटाता है।

तालिका 15.4: पोर्ट बीआईएफ

पोर्ट ड्राइवर पर लागू होने वाले कुछ अतिरिक्त BIF: port_control/3 और erlang:port_call/3