Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

सिस्टम कॉल को समझना:लिनक्स में उद्देश्य, कार्यक्षमता और सामान्य उपयोग

<पी> इस लिनक्सहिंट लेख में, हम बताएंगे कि सिस्टम कॉल क्या हैं, उनका उपयोग किस लिए किया जाता है, और मानक सी लाइब्रेरी में उन्हें अन्य कार्यों से क्या अलग बनाता है। हम आपको यह भी दिखाएंगे कि वे सिस्टम में कर्नेल के लिए क्या कार्य करते हैं और प्रक्रियाएं उनके द्वारा प्रदान की जाने वाली सेवाओं का उपयोग कैसे करती हैं। हम आपको प्रत्येक फ़ंक्शन और हेडर के संक्षिप्त विवरण के साथ सबसे अधिक उपयोग की जाने वाली सिस्टम कॉल की एक सूची भी दिखाएंगे जिसमें उन्हें घोषित किया गया है। दूसरे अनुभाग में, हम आपको दिखाएंगे कि कमांड कंसोल के माध्यम से सिस्टम कॉल के संचालन की निगरानी कैसे करें।

<पी> वैचारिक रूप से, सभी प्रणालियाँ परतों से बनी होती हैं जिनमें प्रत्येक का अपना कार्य और विशेषाधिकार होता है। सिस्टम बनाने वाली परतों का यह ढेर हार्डवेयर घटकों के साथ सबसे निचले स्तर पर शुरू होता है और शीर्ष परत पर समाप्त होता है जिसे उपयोगकर्ता मोड के रूप में जाना जाता है।

<पी> वे सभी प्रोग्राम जो हम अपने कंप्यूटर पर चलाते हैं और सभी कोड, हम परिणाम को एक प्रक्रिया में लिखते और संकलित करते हैं जो सिस्टम के उपयोगकर्ता मोड में चलता है। इस मोड में, उपयोगकर्ता काम करता है और अपने दैनिक कार्य करता है, विभिन्न एप्लिकेशन लॉन्च करता है और उनका उपयोग करता है, फ़ाइलों का प्रबंधन करता है, आदि। सुरक्षा स्तर पर, यह सिस्टम की सबसे सतही परत है और इसलिए सबसे अधिक प्रतिबंधित है और, डिफ़ॉल्ट रूप से, सिस्टम संसाधनों को सीधे प्रबंधित और उपयोग करने के लिए पूरी तरह से सीमित है।

<पी> जैसा कि पहले उल्लेख किया गया है, हार्डवेयर परत किसी सिस्टम का सबसे निचला स्तर है। इसके ठीक ऊपर लिनक्स कर्नेल है। कर्नेल ऑपरेटिंग सिस्टम का दिल है जहां यह हार्डवेयर के साथ एकीकृत होता है और इसे सख्ती से प्रबंधित करता है, ऐसा करने के लिए विशेषाधिकारों वाला एकमात्र ऐसा सिस्टम है। उदाहरण के लिए, प्रक्रियाओं और मेमोरी को यहां प्रबंधित किया जाता है, डेटा को हार्ड डिस्क या एसएसडी से एक्सेस किया जाता है, नेटवर्क उपकरणों को नियंत्रित किया जाता है, आदि। ओएस और प्रक्रियाएं हार्डवेयर के साथ जो कुछ भी करती हैं वह कर्नेल के माध्यम से किया जाता है। इसलिए, आप कह सकते हैं कि यह एक प्रकार का फर्मवेयर है जो सॉफ्टवेयर और हार्डवेयर को एकीकृत करता है।

<पी> संसाधन पहुंच और प्रबंधन पर प्रतिबंध को देखते हुए जो ऑपरेटिंग सिस्टम उपयोगकर्ता मोड पर लगाता है, और क्योंकि इन संसाधनों तक पहुंच केवल कर्नेल के माध्यम से संभव है, एक तंत्र जो प्रक्रियाओं को उन संसाधनों के साथ बातचीत करने की अनुमति देता है जिनकी उन्हें कार्य करने की आवश्यकता होती है।

<पी> सिस्टम कॉल, या SysCalls, ऑपरेटिंग सिस्टम द्वारा प्रदान किए गए फ़ंक्शंस का एक सेट है जो उपयोगकर्ता प्रक्रिया और कर्नेल के बीच इंटरफ़ेस के रूप में कार्य करता है। ये फ़ंक्शन हमें ओएस के साथ बातचीत करने और इसके माध्यम से एक सेवा का अनुरोध करने की अनुमति देते हैं जिसके लिए सिस्टम संसाधनों के उपयोग की आवश्यकता होती है। Syscalls संसाधनों या उनके प्रबंधन तक सीधी पहुंच प्रदान नहीं करते हैं, लेकिन कर्नेल वह है जो उन्हें प्रबंधित करता है और उन्हें उस प्रक्रिया के लिए उपलब्ध कराता है जो उन्हें कॉल करती है, लेकिन हमेशा इसके सख्त प्रबंधन के तहत।

<पी> व्यवहार में, सिस्टम कॉल फ़ंक्शंस सामान्य फ़ंक्शंस की तरह दिखते हैं और उसी तरह कार्यान्वित किए जाते हैं। उनके पास इनपुट तर्क होते हैं जिनके लिए संसाधित किया जाने वाला डेटा भेजा जाता है, और आउटपुट तर्क होते हैं जिनके लिए ऑपरेटिंग सिस्टम परिणाम लौटाता है।

<पी> इस प्रकार के फ़ंक्शन को कॉल करने की विधि किसी भी अन्य फ़ंक्शन के समान है जो हमें C लाइब्रेरीज़ में मिलती है। इसलिए, यह प्रश्न कि यह एक कॉलिंग फ़ंक्शन है या नहीं, व्यवहार में, प्रोग्रामर के लिए एक विशुद्ध रूप से वैचारिक प्रश्न है।

<पी> इन फ़ंक्शंस के तर्क C भाषा के मानक प्रकारों का उपयोग करते हैं। हालाँकि, उनके कार्य की प्रकृति से, वे आम तौर पर संकेतक होते हैं जो मेमोरी पते, डिस्क्रिप्टर, पथ इत्यादि को संग्रहीत करते हैं।

<पी> Linux पर, वर्तमान में लगभग 350 सिस्टम कॉल हैं। इसके अलावा, बड़ी संख्या में ऐसे फ़ंक्शन हैं जो सिस्टम कॉल नहीं हैं लेकिन उनके माध्यम से संसाधनों का प्रबंधन करते हैं जैसे कि Malloc(), free(), calloc(), और realloc() फ़ंक्शन जो आपके कोड में syscalls का उपयोग करके मेमोरी को गतिशील रूप से प्रबंधित करते हैं।

लिनक्स कंसोल में स्ट्रेस कमांड के साथ सिस्टम कॉल की निगरानी कैसे करें

<पी> अब जब आप जानते हैं कि सिस्टम कॉल फ़ंक्शंस क्या हैं, तो आइए आपको दिखाते हैं कि "स्ट्रेस" कमांड का उपयोग करके लिनक्स कमांड कंसोल से वास्तविक समय में उनकी निगरानी कैसे करें। "स्ट्रेस" कमांड बहुत लचीला है। इसका उपयोग सिस्टम की निगरानी करने के लिए किया जाता है और यह कई विकल्प प्रदान करता है जिन्हें आप निम्न कमांड के साथ देख सकते हैं:

<पी> जब आप यह कमांड चलाते हैं, तो "स्ट्रेस" द्वारा पेश किए गए मॉनिटरिंग विकल्पों की सूची कमांड कंसोल में प्रदर्शित होती है।

<पी> सिस्टम कॉल को समझना:लिनक्स में उद्देश्य, कार्यक्षमता और सामान्य उपयोग

<पी> किसी प्रक्रिया के syscalls की निगरानी करने के लिए, हमें इसे निम्नलिखित कमांड के साथ चलाने की आवश्यकता है:

<पी> स्ट्रैक
स्ट्रेस ./प्रक्रिया
ई -ह

<पी> इसका परीक्षण करने के लिए, हम निम्नलिखित कोड को संकलित करते हैं जिसे हमने "सी भाषा में कनेक्ट फ़ंक्शन" शीर्षक वाले अपने लेख में एक उदाहरण के रूप में दिया था। यह कोड, हालांकि बहुत सरल है, बहुत दिलचस्प है क्योंकि यह हमें HTTP सेवा के माध्यम से Google होस्ट से जोड़ता है और हमें कमांड भेजने और प्रतिक्रिया प्राप्त करने की अनुमति देता है।

<पी> #शामिल
#शामिल
#शामिल करें
#शामिल
#शामिल
#शामिल
#शामिल
#शामिल

<पी> पूर्णांक मुख्य(){

<पी> // चरण 1
int सॉकेट_आईडी;
इंट पोर्ट =80;
पूर्णांक त्रुटि;
चार बफ़र [1025];

<पी> स्ट्रक्चर होस्टेंट *सर्वर;
struct sockaddr_in क्लाइंट;
मेमसेट(&सर्वर, 0, साइजऑफ(सर्वर)); <पी> // चरण 2
सर्वर =gethostbyname ("www.google.com");
यदि (सर्वर ==शून्य)
  {
     प्रिंटफ ("\nडोमेन डेटा प्राप्त करने में त्रुटि।\n");
     वापसी 1;
  }

<पी> // चरण 3
सॉकेट_आईडी =सॉकेट (AF_INET, SOCK_STREAM, 0);

<पी> //चरण 4
client.sin_family =AF_INET;
client.sin_port =htons(पोर्ट);

<पी> // चरण 5
bcopy((char *) सर्वर->h_addr,
  (चार *) &client.sin_addr.s_addr,
  sizeof(server->h_length));

<पी> त्रुटि=कनेक्ट(सॉकेट_आईडी, (स्ट्रक्चर सॉकएड्र *) और क्लाइंट, साइजऑफ(क्लाइंट)); <पी> यदि (त्रुटि <0){
  प्रिंटफ ("\nसर्वर से कनेक्शन स्थापित नहीं किया जा सका\n");
  बंद करें(सॉकेट_आईडी);
  वापसी 1;
  }

<पी> प्रिंटफ़ ("\nकनेक्ट करें:%s\n", inet_ntoa( client.sin_addr ));
जबकि (1){

<पी> प्रिंटफ ("बाहर निकलने के लिए Ctrl+c दबाएं \nhttp कमांड भेजें:");
fgets(बफर, 1025, stdin);
भेजें(सॉकेट_आईडी, बफ़र, 1025, 0);
मेमसेट(&बफ़र, '\0', 1025);
recv(सॉकेट_आईडी, बफ़र, 1025, 0);
प्रिंटफ़ ("%s", बफ़र);
मेमसेट(&बफ़र, '\0', 1025);

<पी> }

<पी> }

<पी> हम कोड संकलित करते हैं और इसे "कनेक्ट" आउटपुट नाम देते हैं। फिर, हम इसे "./कनेक्ट" कमांड के साथ निष्पादित करते हैं और सिस्कॉल की निगरानी करने में सक्षम होने के लिए "स्ट्रेस" कमांड को जोड़ते हैं।

<पी> यह कमांड कमांड कंसोल में प्रक्रियाओं के syscalls को प्रदर्शित करता है। जैसा कि निम्नलिखित चित्र में देखा गया है, हालाँकि हमारे कोड में केवल सॉकेट(), कनेक्ट(), सेंड() और recv() syscalls का उपयोग किया गया है, इसके निष्पादन के लिए हमारे द्वारा उपयोग किए जाने वाले फ़ंक्शन के कोड में होने वाली अन्य सिस्टम कॉल की आवश्यकता होती है।

<पी> सिस्टम कॉल को समझना:लिनक्स में उद्देश्य, कार्यक्षमता और सामान्य उपयोग

<पी> निम्न आदेश किसी प्रक्रिया के समाप्त होने पर उसके लिए सिस्टम कॉल का सारांश प्रदर्शित करता है:

<पी> सिस्टम कॉल को समझना:लिनक्स में उद्देश्य, कार्यक्षमता और सामान्य उपयोग

<पी> प्रक्रिया प्रबंधन के लिए सिस्टम कॉल फ़ंक्शन:

फ़ंक्शन विवरण शीर्षलेख एक्सेल() <पी> execlp()

<पी> एक्सेल()

<पी> कार्यकारी() <पी> execvp()

<पी> execvpe()

सिस्टम फ़ंक्शंस कॉल का परिवार जो मूल प्रक्रिया से पीआईडी ​​और संसाधनों को प्राप्त करके एक प्रक्रिया को दूसरे के साथ प्रतिस्थापित करता है। unistd.hfork() एक प्रक्रिया को डुप्लिकेट करता है। unistd.hgetpid() कॉलिंग प्रक्रिया की PID प्राप्त करता है। unistd.hgetppid() कॉलिंग प्रक्रिया की मूल प्रक्रिया की PID प्राप्त करता है। unistd.hexit() एक प्रक्रिया की निकास स्थिति की रिपोर्ट करता है। stdlib.hgetcwd() <पी> getwd()

कॉलिंग प्रक्रिया की वर्तमान कार्यशील निर्देशिका के साथ एक स्ट्रिंग लौटाता है। unistd.hpause() सिग्नल आने तक प्रक्रिया को रोकता है। unistd.wait() मूल प्रक्रिया से चाइल्ड प्रक्रिया के आउटपुट की प्रतीक्षा करता है।wait.h <पी> फ़ाइल प्रबंधन के लिए सिस्टम कॉल फ़ंक्शन:

कार्य विवरण शीर्षक खुला() <पी> openat()

फ़ाइलें खोलें.fcntl.hclose() फ़ाइलें बंद करें.unistd.hread() फ़ाइलें पढ़ें.unistd.hpoll() किसी विशिष्ट ऑपरेशन के लिए फ़ाइलों की उपलब्धता का सर्वेक्षण करता है.poll.hwrite() फ़ाइलें लिखें.unistd.hfcntl() फ़ाइल डिस्क्रिप्टर में हेरफेर करता है.fcntl.htrunate() <पी> ftruncate()

किसी फ़ाइल को निर्दिष्ट लंबाई तक छोटा करेंunistd.hcreat() एक फ़ाइल बनाएँ.fcntl.hchmod() <पी> fchmod()

किसी Filesys/stat.hunlink() की अनुमतियाँ सेट करता है, किसी फ़ाइल.unistd.h को हटाता है <पी> सिग्नल हैंडलिंग के लिए सिस्टम कॉल फ़ंक्शन:

कार्य विवरण सिग्नल() एक सिग्नल को हैंडलर से जोड़ता है। सिग्नल.hkill() एक सिग्नल को एक प्रक्रिया के लिए भेजता है। सिग्नल.hkillpg() प्रक्रियाओं के एक समूह को एक सिग्नल भेजता है। सिग्नल। hraise() उस प्रक्रिया में एक सिग्नल की क्रिया करता है जो इसे आमंत्रित करता है। सिग्नल.hsigaction() सिग्नल की कार्रवाई सेट करता है। सिग्नल.hsigwait() निर्दिष्ट सिग्नल तक कॉलिंग थ्रेड के निष्पादन को निलंबित करता है आता है.signal.hsigold() कॉलिंग प्रक्रिया में सिग्नल जोड़ें' सिग्नल मास्क.सिग्नल.hsigignore() सिग्नल को अनदेखा करें.signal.hsigblock() सिग्नल को ब्लॉक करें.signal.hpsignal() <पी> psiginfo()

सिग्नल.सिग्नल.एच के विवरण के साथ एक संदेश प्रिंट करता है <पी> सॉकेट हैंडलिंग के लिए सिस्टम कॉल फ़ंक्शन:

कार्य विवरण सॉकेट() एक सॉकेट बनाएं। सॉकेट.एचबाइंड() एक नाम को सॉकेट सॉकेट से बांधें। <पी> recvfrom()

<पी> recvmsg()

सॉकेट.सॉकेट.एचएसेंड() से एक संदेश प्राप्त होता है <पी> को भेजें()

<पी> संदेश भेजें()

सॉकेट.सॉकेट.hgetsockname() से एक संदेश भेजें, इसके डिस्क्रिप्टर.सॉकेट.hgetsockopt() द्वारा विशिष्ट सॉकेट का पता लौटाता है सॉकेट.सॉकेट.h पर विकल्प सेट करें या प्राप्त करें

निष्कर्ष

<पी> इस Linuxhint आलेख में, हमने बताया कि सिस्टम कॉल फ़ंक्शंस क्या हैं और उनका उपयोग कर्नेल सेवाओं का अनुरोध करने के लिए कैसे किया जाता है जिसमें सिस्टम संसाधनों का उपयोग शामिल होता है। हमने आपको एक संक्षिप्त विवरण दिखाया कि उपयोगकर्ता प्रक्रियाएं क्या हैं और वे सिस्टम कॉल के माध्यम से कर्नेल के साथ कैसे इंटरैक्ट करते हैं।

<पी> इन सुविधाओं को शीघ्रता से व्यवहार में लाने में आपकी सहायता के लिए, हम एक संक्षिप्त विवरण और हेडर के साथ सबसे अधिक उपयोग की जाने वाली सिस्टम कॉल की एक सूची शामिल करते हैं जिसे आपको उनका उपयोग करने के लिए अपने कोड में शामिल करने की आवश्यकता होती है। हमने एक अनुभाग भी शामिल किया है जहां हमने आपको दिखाया है कि कमांड कंसोल के माध्यम से किसी प्रक्रिया के सिस्कॉल की निगरानी कैसे करें।


  1. पायथन में इनऑर्डर और पोस्टऑर्डर ट्रैवर्सल से बाइनरी ट्री का निर्माण करें पायथन में इनऑर्डर और पोस्टऑर्डर ट्रैवर्सल से बाइनरी ट्री का निर्माण करें

    मान लीजिए कि हमारे पास बाइनरी ट्री का इनऑर्डर और पोस्टऑर्डर ट्रैवर्सल सीक्वेंस है। हमें इन अनुक्रमों से वृक्ष उत्पन्न करना है। तो अगर पोस्टऑर्डर और इनऑर्डर अनुक्रम [9,15,7,20,3] और [9,3,15,20,7] हैं, तो पेड़ होगा - आइए चरणों को देखें - मान लीजिए कि विधि को प्रीऑर्डर और इनऑर्डर सूचियों के साथ बिल

  1. पायथन प्रोग्रामिंग में बाइनरी ट्री पोस्टऑर्डर ट्रैवर्सल पायथन प्रोग्रामिंग में बाइनरी ट्री पोस्टऑर्डर ट्रैवर्सल

    मान लीजिए कि हमारे पास एक बाइनरी ट्री है। हमें पुनरावृत्त दृष्टिकोण का उपयोग करके इस पेड़ के पोस्ट ऑर्डर ट्रैवर्सल को खोजना होगा। तो अगर पेड़ जैसा है - तब आउटपुट होगा:[9,15,7,10,-10] इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - यदि रूट शून्य है, तो खाली सरणी लौटाएं एक सरणी रिट बनाएं

  1. SSMS के माध्यम से SQL सर्वर से कनेक्शन कैसे करें SSMS के माध्यम से SQL सर्वर से कनेक्शन कैसे करें

    सभी को नमस्कार, पिछले लेख में, मैंने आपके साथ Microsoft SQL सर्वर स्थापित किया था और SSMS (SQL सर्वर प्रबंधन स्टूडियो) एक इंटरफ़ेस उपकरण है जो SQL सर्वर में हेरफेर का समर्थन करता है। और पिछली पोस्ट की सामग्री को जारी रखने के लिए, इस अगले लेख में, मैं आपको SSMS के माध्यम से SQL सर्वर से जोड़ने में श