linux कर्नेल द्वारा प्रदान की गई सिस्टम कॉल को C प्रोग्रामिंग भाषा में glibc के माध्यम से उजागर किया जाता है। जब एक सिस्टम कॉल का उपयोग किया जाता है, तो आप ओएस से संचार कर रहे हैं और बदले में ओएस आपको सिस्टम कॉल फ़ंक्शंस (रिटर्न वैल्यू) पर लौटाए गए पैरामीटर के माध्यम से संचार करता है।
स्टेट सिस्टम कॉल:
स्टेट सिस्टम कॉल एक फाइल की स्थिति की जांच करने के लिए लिनक्स में एक सिस्टम कॉल है जैसे कि फाइल को कब एक्सेस किया गया था। स्टेट () सिस्टम कॉल वास्तव में फ़ाइल विशेषताएँ देता है। एक इनोड की फ़ाइल विशेषताएँ मूल रूप से स्टेट () फ़ंक्शन द्वारा लौटाई जाती हैं। एक इनोड में फ़ाइल का मेटाडेटा होता है। एक इनोड में शामिल हैं: फ़ाइल का प्रकार, फ़ाइल का आकार, जब फ़ाइल एक्सेस की गई थी (संशोधित, हटाई गई) जो कि टाइम स्टैम्प है, और फ़ाइल का पथ, उपयोगकर्ता आईडी और समूह आईडी, फ़ाइल के लिंक , और फ़ाइल सामग्री का भौतिक पता।
हम कह सकते हैं कि इनोड में वह सभी डेटा होता है जो स्टेट () सिस्टम कॉल के लिए आवश्यक होता है और यह फाइल के लिए इंडेक्स नंबर होता है जो इनोड टेबल में सेव होता है। जब भी आप कोई फ़ाइल बनाते हैं तो उस फ़ाइल के लिए एक इनोड नंबर बनाया जाता है। स्टेट सिस्टम कॉल का उपयोग करके सिस्टम टेबल को देखा जा सकता है।
सी स्टेट सिस्टम कॉल का सिंटेक्स:
सी प्रोग्रामिंग भाषा में स्टेट सिस्टम कॉल का उपयोग करने के लिए, आपको निम्न शीर्षलेख फ़ाइल शामिल करनी होगी:
#शामिल
किसी फ़ाइल की स्थिति प्राप्त करने के लिए Stat का उपयोग किया जाता है। सी स्टेट सिस्टम कॉल का सिंटैक्स प्रत्येक ऑपरेटिंग सिस्टम के लिए समान नहीं हो सकता है। लिनक्स में स्टेट सिस्टम कॉल के लिए सिंटैक्स निम्नानुसार है:
NSराज्य(स्थिरांक char *पथ, structराज्य*बुफे)
इंट में फ़ंक्शन का रिटर्न प्रकार, यदि फ़ंक्शन सफलतापूर्वक निष्पादित किया जाता है, तो कोई त्रुटि होने पर 0 वापस कर दिया जाता है, -1 वापस कर दिया जाएगा।
यहां कास्ट चार * पथ फ़ाइल का नाम निर्दिष्ट करता है। यदि फ़ाइल का पथ प्रतीकात्मक लिंक है तो आपको फ़ाइल नाम के बजाय लिंक निर्दिष्ट करने की आवश्यकता है।
फिर फ़ंक्शन में हमारे पास एक स्टेट स्ट्रक्चर होता है जिसमें फ़ाइल के बारे में डेटा या जानकारी संग्रहीत होती है जो नामित पॉइंटर का उपयोग करती है बफ, जिसे एक पैरामीटर के रूप में पास किया जाता है और कॉल के निष्पादन के दौरान भरा जाता है और कॉल के बाद उपयोगकर्ता द्वारा पढ़ा जा सकता है।
स्टेट स्ट्रक्चर:
हेडर फ़ाइल में परिभाषित स्टेट स्ट्रक्चर में निम्नलिखित फ़ील्ड शामिल हैं:
structराज्य{
मोड_टी st_mode;
ino_t st_ino;
dev_t st_dev;
dev_t st_rdev;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
ऑफ_टीst_size;
structटाइमस्पेक st_atim;
structटाइमस्पेक st_mtim;
structटाइमस्पेक st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};
विवरण:
- st_dev: यह उस डिवाइस की आईडी है जिसमें वर्तमान में हमारी फाइल रहती है।
- st_rdev: यह फ़ील्ड बताता है कि एक विशेष फ़ाइल एक विशेष डिवाइस का प्रतिनिधित्व करती है।
- st_ino: यह फ़ाइल का इनोड नंबर या सीरियल नंबर है। चूंकि यह एक इंडेक्स नंबर है इसलिए यह सभी फाइलों के लिए अद्वितीय होना चाहिए
- st_size: st_size बाइट्स में फ़ाइल का आकार है।
- st_atime: यह आखिरी बार या हाल ही का समय है जब फ़ाइल को एक्सेस किया गया था।
- st_ctime: यह हाल ही का समय है जब फ़ाइल की स्थिति या अनुमतियाँ बदली गई थीं।
- st_mtime: यह हाल ही का समय है जब फ़ाइल को संशोधित किया गया था।
- st_blksize: यह फ़ील्ड I/O फ़ाइल सिस्टम के लिए पसंदीदा ब्लॉक आकार देता है जो फ़ाइल से फ़ाइल में भिन्न हो सकता है।
- st_blocks: यह फ़ील्ड 512 बाइट्स के गुणकों में ब्लॉक की कुल संख्या बताती है।
- st_nलिंक: यह फ़ील्ड हार्ड लिंक की कुल संख्या बताती है।
- st_uid: यह फ़ील्ड उपयोगकर्ता आईडी इंगित करता है।
- st_gid: यह फ़ील्ड समूह आईडी को इंगित करता है।
- st_mode: यह फ़ाइल पर अनुमतियों को इंगित करता है, फ़ाइल पर मोड बताता है। निम्नलिखित झंडे हैं जिन्हें st_mode फ़ील्ड के लिए परिभाषित किया जाना चाहिए:
झंडे | विवरण | ध्वज मूल्य |
---|---|---|
एस_आईएफएमटी | फ़ाइल का मोड मान प्राप्त करने के लिए उपयोग किया जाने वाला बिटमास्क | 0170000 |
S_IFSOCK | सॉकेट की एक फ़ाइल स्थिरांक | 0140000 |
S_IFLINK | प्रतीकात्मक लिंक की एक फ़ाइल स्थिरांक | 0120000 |
एस_आईएफआरईजी | नियमित फ़ाइल के लिए फ़ाइल स्थिरांक | 0100000 |
एस_आईएफबीएलके | ब्लॉक फ़ाइल के लिए फ़ाइल स्थिरांक | 0060000 |
एस_आईएफडीआईआर | निर्देशिका फ़ाइल के लिए फ़ाइल स्थिरांक | 0040000 |
एस_आईएफसीएचआर | चरित्र फ़ाइल के लिए फ़ाइल स्थिरांक | 0020000 |
S_IFIFO | फीफो की एक फ़ाइल स्थिरांक | 0010000 |
एस_आईएसयूआईडी | उपयोगकर्ता आईडी बिट सेट करें | 0004000 |
एस_आईएसजीआईडी | समूह आईडी बिट सेट करें | 0002000 |
एस_आईएसवीटीएक्स | स्टिकी बिट जो साझा पाठ को इंगित करता है | 0001000 |
S_IRWXU | स्वामी अनुमतियाँ (पढ़ें, लिखें, निष्पादित करें) | 00700 |
एस_आईआरयूएसआर | स्वामी के लिए अनुमतियाँ पढ़ें | 00400 |
S_IWUSR | स्वामी के लिए अनुमतियाँ लिखें | 00200 |
S_IXUSR | स्वामी के लिए अनुमतियाँ निष्पादित करें | 00100 |
S_IRWXG | समूह अनुमतियाँ (पढ़ें, लिखें, निष्पादित करें) | 00070 |
एस_आईआरजीआरपी | समूह के लिए अनुमतियाँ पढ़ें | 00040 |
S_IWGRP | समूह के लिए अनुमतियाँ लिखें | 00020 |
S_IXGRP | समूह के लिए अनुमतियाँ निष्पादित करें | 00010 |
S_IRWXO | दूसरों के लिए अनुमतियाँ (पढ़ें, लिखें, निष्पादित करें) | 00007 |
S_IROTH | दूसरों के लिए अनुमतियाँ पढ़ें | 00004 |
S_IWOTH | दूसरों के लिए अनुमतियां लिखें | 00002 |
S_IXOTH | दूसरों के लिए अनुमतियाँ निष्पादित करें | 00001 |
स्टेट सिस्टम कॉल का उपयोग कैसे करें:
निम्न उदाहरण दिखाता है कि लिनक्स, उबंटू में सी प्रोग्रामिंग भाषा में स्टेट सिस्टम कॉल का उपयोग कैसे करें।
उदाहरण 1:
निम्नलिखित कोड में हम एक फाइल का मोड खोजने जा रहे हैं:
कोड:
#शामिल#शामिल
NSमुख्य()
{
// स्टेट स्ट्रक्चर के लिए पॉइंटर
structराज्य sfile;
// स्टेट सिस्टम कॉल
राज्य('स्टेट.सी', औरsfile);
// st_mode तक पहुंचना (स्टेट स्ट्रक्चर का डेटा सदस्य)
printf ('st_mode =%o',एसफाइलst_mode);
वापसी 0;
}
प्रोग्राम को संकलित करना और चलाना निम्नानुसार है:
इस कोड में, हमने फ़ाइल का नाम स्टेट सिस्टम कॉल में और फिर पॉइंटर को स्टेट स्ट्रक्चर में पास किया है जो कि sfile है। स्टेट स्ट्रक्चर के पॉइंटर का उपयोग तब st_mode तक पहुंचने के लिए किया जाता है जो प्रिंटफ स्टेटमेंट का उपयोग करके फाइल के मोड को प्रदर्शित करता है।
हेडर फ़ाइल का उपयोग किया जाता है ताकि आप स्टेट सिस्टम कॉल का उपयोग कर सकें। हेडर फ़ाइल मानक इनपुट/आउटपुट लाइब्रेरी फ़ाइल है ताकि आप अपने सी कोड में प्रिंटफ या स्कैनफ का उपयोग कर सकें।
उदाहरण 2:
निम्नलिखित कोड में हम स्टेट सिस्टम कॉल का उपयोग करके फ़ाइल के बारे में जानकारी प्राप्त करने जा रहे हैं:
कोड:
#शामिल#शामिल
#शामिल
#शामिल
शून्यsfile(char स्थिरांकफ़ाइल का नाम[]);
NSमुख्य(){
ssize_t पढ़ें;
char*बफर= 0;
size_tbuf_size= 0;
printf ('जांच करने के लिए फ़ाइल का नाम दर्ज करें:एन');
पढ़ना=लाइन में आओ(औरबफर, औरbuf_size,स्टडिन);
अगर (पढ़ना<=0 ){
printf ('गेटलाइन विफल'एन');
बाहर जाएं (1);
}
अगर (बफर[पढ़ना-1] == 'एन'){
बफर[पढ़ना-1] = 0;
}
NSएस=खोलना(बफर,O_RDONLY);
अगर(एस== -1){
printf ('फ़ाइल मौजूद नहीं है'एन');
बाहर जाएं (1);
}
अन्यथा{
sfile(बफर);
}
नि: शुल्क (बफर);
वापसी 0;
}
शून्यsfile(char स्थिरांकफ़ाइल का नाम[]){
structराज्य sfile;
अगर(राज्य(फ़ाइल का नाम, औरsfile)== -1){
printf ('त्रुटि हुईएन');
}
// स्टेट स्ट्रक्चर के डेटा सदस्यों तक पहुंचना
printf ('एनफ़ाइल st_uid %dएन',एसफाइलst_uid);
printf ('एनफ़ाइल st_blksize %ldएन',एसफाइलst_blksize);
printf ('एनफ़ाइल st_gid %dएन',एसफाइलst_gid);
printf ('एनफ़ाइल st_blocks %ldएन',एसफाइलst_blocks);
printf ('एनफ़ाइल st_size%ldएन',एसफाइलst_size);
printf ('एनफ़ाइल st_nlink% uएन',(अहस्ताक्षरित NS)एसफाइलst_nlink);
printf ('एनफ़ाइल अनुमतियाँ उपयोगकर्ताएन');
printf ((एसफाइलst_mode औरएस_आईआरयूएसआर)? 'आर':'-');
printf ((एसफाइलst_mode औरS_IWUSR)? 'में':'-');
printf ((एसफाइलst_mode औरS_IXUSR)? 'एक्स':'-');
printf ('एन');
printf ('एनफ़ाइल अनुमति समूहएन');
printf ((एसफाइलst_mode औरएस_आईआरजीआरपी)? 'आर':'-');
printf ((एसफाइलst_mode औरS_IWGRP)? 'में':'-');
printf ((एसफाइलst_mode औरS_IXGRP)? 'एक्स':'-');
printf ('एन');
printf ('एनफ़ाइल अनुमतियाँ अन्यएन');
printf ((एसफाइलst_mode औरS_IROTH)? 'आर':'-');
printf ((एसफाइलst_mode औरS_IWOTH)? 'में':'-');
printf ((एसफाइलst_mode औरS_IXOTH)? 'एक्स':'-');
printf ('एन');
}
आउटपुट:
उपरोक्त सी कोड में, हमने फ़ाइल का नाम दर्ज किया है और यदि फ़ाइल मौजूद नहीं है तो प्रोग्राम का निष्पादन रोक दिया जाएगा। यह निम्नलिखित छवि में प्रदर्शित किया गया है:
अगर हमारी फाइल मौजूद है, तो फंक्शन sfile(n) को कॉल किया जाएगा जिसमें हमने फाइल का नाम पास किया है। फ़ंक्शन के अंदर, सबसे पहले हमने स्टेट सिस्टम कॉल का उपयोग किया है, यदि स्टेट () रिटर्न -1 है तो कोई त्रुटि होनी चाहिए ताकि एक संदेश मुद्रित हो और प्रोग्राम का निष्पादन रोक दिया जाएगा।
फिर प्रिंटफ स्टेटमेंट में हमने के डेटा सदस्यों तक पहुंचने के लिए फ़ंक्शन और डॉट सेपरेटर के नाम का उपयोग किया है स्टेट स्ट्रक्चर .
फिर फ़ाइल के मोड के लिए हमने st_mode के मैक्रोज़ या फ़्लैग्स को एक्सेस किया है। यहां संबंधित मोड को प्रिंट करने के लिए लॉजिकल और ऑपरेटर का उपयोग किया जाता है। हमने निर्दिष्ट फ़ाइल (उपयोगकर्ता द्वारा दर्ज फ़ाइल नाम) के लिए उपयोगकर्ता, समूह और अन्य के लिए अनुमतियों की जांच की है।
इसके साथ आप देख सकते हैं कि ओएस कर्नेल से फाइलों के बारे में जानकारी प्राप्त करने के लिए सी प्रोग्रामिंग भाषा से स्टेट सिस्टम कॉल का उपयोग कैसे करें। अगर आपका कोई सवाल है तो बेझिझक हमें कमेंट सेक्शन के जरिए बताएं।