برنامج Stat System Call Linux التعليمي

Stat System Call Linux Tutorial



يتم عرض مكالمات النظام التي توفرها نواة لينكس بلغة البرمجة C عبر glibc. عند استخدام مكالمة نظام ، فأنت تتصل بنظام التشغيل وعند العودة يتصل نظام التشغيل بك من خلال المعلمات التي يتم إرجاعها إلى وظائف استدعاء النظام (قيم الإرجاع).

استدعاء نظام الإحصائيات:

استدعاء نظام الإحصاء هو استدعاء نظام في Linux للتحقق من حالة الملف مثل التحقق من وقت الوصول إلى الملف. يقوم استدعاء النظام stat () بإرجاع سمات الملف بالفعل. يتم إرجاع سمات ملف inode بشكل أساسي بواسطة دالة Stat (). يحتوي inode على البيانات الأولية للملف. يحتوي inode على: نوع الملف ، حجم الملف ، وقت الوصول إلى الملف (تعديل ، حذف) هذا هو طوابع زمنية ، ومسار الملف ، ومعرف المستخدم ومعرف المجموعة ، وروابط الملف والعنوان الفعلي لمحتوى الملف.







يمكننا القول أن inode يحتوي على جميع البيانات المطلوبة لاستدعاء نظام stat () وهو رقم الفهرس للملف المحفوظ في جدول inode. كلما قمت بإنشاء ملف ، يتم إنشاء رقم inode لهذا الملف. يمكن استخدام نظام الإحصائيات استدعاء جداول النظام.



بناء جملة استدعاء نظام C Stat:

لاستخدام استدعاء نظام stat في لغة البرمجة C ، يجب عليك تضمين ملف الرأس التالي:



#يشمل

يستخدم Stat للحصول على حالة الملف. قد لا يكون بناء جملة استدعاء نظام C stat هو نفسه لكل نظام تشغيل. في Linux ، تكون صيغة استدعاء نظام stat كما يلي:





intحالة(مقدار ثابت شار *طريقو هيكلحالة*بوف)

نوع الإرجاع للوظيفة في int ، إذا تم تنفيذ الوظيفة بنجاح ، فسيتم إرجاع 0 في حالة وجود أي أخطاء ، وسيتم إرجاع -1.

هنا مسار حرف * يحدد اسم الملف. إذا كان مسار الملف رابطًا رمزيًا ، فأنت بحاجة إلى تحديد الارتباط بدلاً من اسم الملف.



ثم في الوظيفة لدينا بنية stat يتم فيها تخزين البيانات أو المعلومات حول الملف والتي تستخدم مؤشر اسمه بوف والتي يتم تمريرها كمعامل ويتم ملؤها أثناء تنفيذ المكالمة ويمكن للمستخدم قراءتها بعد المكالمة.

هيكل الإحصاء:

يحتوي الهيكل الأساسي الذي تم تعريفه في ملف الرأس على الحقول التالية:

هيكلحالة
{
mode_t 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؛
off_tst_size؛
هيكلtimspec st_atim؛
هيكلtimspec st_mtim؛
هيكلtimspec st_ctim؛
blksize_t st_blksize؛
blkcnt_t st_blocks؛
}؛

وصف:

  1. st_dev: إنه معرف الجهاز الذي يوجد به ملفنا حاليًا.
  2. st_rdev: يصف هذا الحقل أن ملفًا معينًا يمثل جهازًا معينًا.
  3. st_ino: إنه رقم inode أو الرقم التسلسلي للملف. نظرًا لأنه رقم فهرس ، يجب أن يكون فريدًا لجميع الملفات
  4. st_size: st_size هو حجم الملف بالبايت.
  5. st_atime: إنها آخر مرة أو آخر وقت تم فيه الوصول إلى الملف.
  6. st_ctime: إنه آخر وقت تم فيه تغيير حالة الملف أو أذوناته.
  7. st_mtime: إنه آخر وقت تم فيه تعديل الملف.
  8. st_blksize: يعطي هذا الحقل حجم الكتلة المفضل لنظام ملفات الإدخال / الإخراج والذي قد يختلف من ملف إلى ملف.
  9. st_blocks: يخبر هذا الحقل العدد الإجمالي للكتل بمضاعفات 512 بايت.
  10. st_nlink: يوضح هذا الحقل العدد الإجمالي للروابط الصلبة.
  11. st_uid: يشير هذا الحقل إلى معرف المستخدم.
  12. st_gid: يشير هذا الحقل إلى معرف المجموعة.
  13. st_mode: يشير إلى الأذونات على الملف ، ويخبر أوضاع الملف. فيما يلي العلامات التي يجب تحديدها لحقل st_mode:
أعلام وصف قيمة العلامة
S_IFMT قناع بت يستخدم للحصول على قيمة الوضع لملف 0170000
S_IFSOCK ملف ثابت من المقبس 0140000
S_IFLINK ثابت ملف من ارتباط رمزي 0120000
S_IFREG ثابت الملف للملف العادي 0100000
S_IFBLK ثابت الملف لملف الحظر 0060000
S_IFDIR ثابت الملف لملف الدليل 0040000
S_IFCHR ثابت الملف لملف الشخصية 0020000
S_IFO ثابت ملف فيفو 0010000
S_ISUID تعيين بت معرف المستخدم 0004000
S_ISGID تعيين بت معرف المجموعة 0002000
S_ISVTX بت مثبت مما يشير إلى نص مشترك 0001000
S_IRWXU أذونات المالك (قراءة وكتابة وتنفيذ) 00700
S_IRUSR اقرأ أذونات المالك 00400
S_IWUSR كتابة أذونات للمالك 00200
S_IXUSR تنفيذ أذونات للمالك 00100
S_IRWXG أذونات المجموعة (قراءة وكتابة وتنفيذ) 00070
S_IRGRP قراءة أذونات المجموعة 00040
S_IWGRP كتابة أذونات للمجموعة 00020
S_IXGRP تنفيذ أذونات للمجموعة 00010
S_IRWXO أذونات للآخرين (قراءة ، كتابة ، تنفيذ) 00007
S_IROTH قراءة الأذونات للآخرين 00004
S_IWOTH اكتب أذونات للآخرين 00002
S_IXOTH تنفيذ أذونات للآخرين 00001

كيفية استخدام استدعاء نظام Stat:

يوضح المثال التالي كيفية استخدام استدعاء نظام stat في لغة برمجة C في Linux ، Ubuntu.

مثال 1:

في الكود التالي سنجد وضع الملف:

الشفرة:

#يشمل
#يشمل
intالأساسية()
{
// مؤشر لإحصائيات الهيكل
هيكلالدولة sfile؛

// نظام استدعاء النظام الأساسي
حالة('stat.c'و &sfile)؛

// الوصول إلى st_mode (عضو بيانات في بنية الإحصاء)
printf ('st_mode =٪ o'وsfile.st_mode)؛
إرجاع 0؛
}

تجميع وتشغيل البرنامج يعود على النحو التالي:

في هذا الكود ، قمنا بتمرير اسم الملف في استدعاء نظام stat ثم المؤشر إلى stat الهيكل وهو sfile. يتم بعد ذلك استخدام مؤشر الحالة الثابتة للوصول إلى st_mode الذي يعرض وضع الملف باستخدام عبارة printf.

يتم استخدام ملف الرأس حتى تتمكن من استخدام استدعاء النظام الأساسي. ملف الرأس هو ملف مكتبة الإدخال / الإخراج القياسي بحيث يمكنك استخدام printf أو scanf في كود C.

المثال 2:

في الكود التالي سنحصل على معلومات حول الملف باستخدام stat system call:

الشفرة:

#يشمل
#يشمل
#يشمل
#يشمل

فارغsfile(شار مقدار ثابتاسم الملف[])؛

intالأساسية(){
قراءة ssize_t؛
شار*متعادل= 0؛
size_tbuf_size= 0؛

printf (أدخل اسم الملف المراد التحقق منه:ن')؛
اقرأ=الحصول على خط(&متعادلو &buf_sizeوستدين)؛

لو (اقرأ<=0 ){
printf (فشل Getlineن')؛
خروج (1)؛
}

لو (متعادل[اقرأ-1] == 'ن'){
متعادل[اقرأ-1] = 0؛
}

intس=افتح(متعادلوO_RDONLY)؛
لو(س== -1){
printf ('الملف غير موجودن')؛
خروج (1)؛
}
آخر{
sfile(متعادل)؛
}
مجانا (متعادل)؛
إرجاع 0؛
}

فارغsfile(شار مقدار ثابتاسم الملف[]){

هيكلالدولة sfile؛

لو(حالة(اسم الملفو &sfile)== -1){
printf ('حدث خطأن')؛
}

// الوصول إلى بيانات أعضاء الهيئة الإحصائية
printf ('نملف st_uid٪ dن'وsfile.st_uid)؛
printf ('نملف st_blksize٪ ldن'وsfile.st_blksize)؛
printf ('نملف st_gid٪ dن'وsfile.st_gid)؛
printf ('نst_blocks الملف٪ ldن'وsfile.st_blocks)؛
printf ('نحجم الملف٪ ldن'وsfile.st_size)؛
printf ('نملف st_nlink٪ uن'و(غير موقعة int)sfile.st_nlink)؛
printf ('نمستخدم أذونات الملفاتن')؛
printf ((sfile.st_mode &S_IRUSR)؟ 'r':'-')؛
printf ((sfile.st_mode &S_IWUSR)؟ 'في':'-')؛
printf ((sfile.st_mode &S_IXUSR)؟ 'x':'-')؛
printf ('ن')؛
printf ('نمجموعة أذونات الملفاتن')؛
printf ((sfile.st_mode &S_IRGRP)؟ 'r':'-')؛
printf ((sfile.st_mode &S_IWGRP)؟ 'في':'-')؛
printf ((sfile.st_mode &S_IXGRP)؟ 'x':'-')؛
printf ('ن')؛
printf ('نأذونات الملفات أخرىن')؛
printf ((sfile.st_mode &S_IROTH)؟ 'r':'-')؛
printf ((sfile.st_mode &S_IWOTH)؟ 'في':'-')؛
printf ((sfile.st_mode &S_IXOTH)؟ 'x':'-')؛
printf ('ن')؛
}

انتاج:

في كود C أعلاه ، أدخلنا اسم الملف وإذا لم يكن الملف موجودًا ، فسيتم إيقاف تنفيذ البرنامج. هذا موضح في الصورة التالية:

إذا كان ملفنا موجودًا ، فسيتم استدعاء الوظيفة sfile (n) التي مررنا فيها اسم الملف. داخل الوظيفة ، استخدمنا أولاً استدعاء نظام Stat ، إذا أعادت stat () -1 ، فيجب أن يكون هناك أي خطأ حتى تتم طباعة رسالة وسيتم إيقاف تنفيذ البرنامج.

ثم في بيان printf ، استخدمنا اسم الوظيفة وفاصل النقاط للوصول إلى أعضاء البيانات في الهيكل الأساسي .

ثم بالنسبة لوضع الملف ، وصلنا إلى وحدات الماكرو أو أعلام st_mode. هنا يتم استخدام المنطق والعامل لطباعة الأوضاع المعنية. لقد تحققنا من أذونات المستخدم والمجموعة وآخرين للملف المحدد (اسم الملف الذي أدخله المستخدم).

باستخدام هذا يمكنك معرفة كيفية استخدام استدعاء نظام stat من لغة البرمجة C للحصول على معلومات من OS kernel حول الملفات. إذا كان لديك سؤال فلا تتردد في إخبارنا عبر قسم التعليقات.