מערכת שיחות לינוקס של מערכת מערכת

Stat System Call Linux Tutorial



שיחות מערכת המסופקות על ידי ליבת לינוקס נחשפות בשפת התכנות C באמצעות glibc. כאשר משתמשים בשיחת מערכת, אתה מתקשר למערכת ההפעלה ובחזרה מערכת ההפעלה מתקשרת אליך באמצעות הפרמטרים המוחזרים לפונקציות שיחת המערכת (ערכי החזרה).

שיחת מערכת Stat:

שיחת מערכת סטט היא קריאת מערכת ב- Linux לבדיקת סטטוס של קובץ כגון בדיקת מתי הגישה לקובץ. קריאת המערכת stat () מחזירה למעשה תכונות קובץ. תכונות הקובץ של inode מוחזרות בעצם על ידי הפונקציה Stat (). Inode מכיל את המטא נתונים של הקובץ. Inode מכיל: סוג הקובץ, גודל הקובץ, כאשר הגישה לקובץ (שונה, נמחק) המהווה חותמות זמן, ונתיב הקובץ, מזהה המשתמש ומזהה הקבוצה, קישורים של הקובץ , וכתובת פיזית של תוכן הקובץ.







אנו יכולים לומר כי inode מכיל את כל הנתונים הנדרשים לשיחת המערכת stat () וזהו מספר האינדקס של הקובץ שנשמר בטבלת ה- inode. בכל פעם שאתה יוצר קובץ נוצר מספר קוד לאותו קובץ. באמצעות קריאת מערכת סטט ניתן לראות את טבלאות המערכת.



תחביר שיחת מערכת C Stat:

כדי להשתמש בקריאת מערכת stat בשפת התכנות C, עליך לכלול את קובץ הכותרת הבא:



#לִכלוֹל

Stat משמש כדי לקבל את הסטטוס של קובץ. התחביר של שיחת מערכת C stat עשוי להיות זהה עבור כל מערכת הפעלה. ב- Linux התחביר לשיחת מערכת סטט היא כדלקמן:





intמדינה(קבוע לְהַשְׁחִיר *נָתִיב, מבנהמדינה*buf)

סוג ההחזרה של הפונקציה ב- int, אם הפונקציה מבוצעת בהצלחה, 0 מוחזר אם יש שגיאות, -1 יוחזר.

פה const char *נתיב מציין את שם הקובץ. אם נתיב הקובץ הוא קישור סמלי, עליך לציין את הקישור במקום שם הקובץ.



אז בפונקציה יש לנו מבנה סטטוס שבו הנתונים או המידע על הקובץ מאוחסנים המשתמשים במצביע בשם בוף, אשר מועבר כפרמטר וממלא במהלך ביצוע השיחה וניתן לקרוא אותו על ידי המשתמש לאחר השיחה.

מבנה סטטוס:

מבנה הנתונים המוגדר בקובץ הכותרת מכיל את השדות הבאים:

מבנהמדינה
{
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_tגודל_גודל;
מבנה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 הוא גודל הקובץ בבתים.
  5. st_atime: זוהי הפעם האחרונה או האחרונה שבה ניגש לקובץ.
  6. st_ctime: זוהי התקופה האחרונה שבה שונה המצב או ההרשאות של הקובץ.
  7. st_mtime: זוהי התקופה האחרונה בה שונה הקובץ.
  8. st_blksize: שדה זה נותן את גודל הבלוק המועדף עבור מערכת קבצי I/O שעשוי להשתנות מקובץ לקובץ.
  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_IFIFO קבוע קובץ של fifo 0010000
S_ISUID הגדר ביט User ID 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:

הדוגמה הבאה מראה כיצד להשתמש בשיחת מערכת סטט בשפת תכנות C בלינוקס, אובונטו.

דוגמא 1:

בקוד הבא אנו הולכים למצוא את מצב הקובץ:

קוד:

#לִכלוֹל
#לִכלוֹל
intרָאשִׁי()
{
// מצביע ל- stat struct
מבנההמדינה sfile;

// קריאת מערכת סטט
מדינה('stat.c', &sfile);

// גישה ל st_mode (חבר נתונים ב- stat struct)
printf ('st_mode = %o',sfile.st_mode);
לַחֲזוֹר 0;
}

הידור והפעלת התוכנית מחזיר כדלקמן:

בקוד זה, העברנו את שם הקובץ בשיחת מערכת stat ולאחר מכן את המצביע ל- stat struct שהוא sfile. המצביע ל- stat struct משמש לאחר מכן לגישה st_mode המציג את מצב הקובץ באמצעות משפט printf.

קובץ הכותרת משמש כדי שתוכל להשתמש בשיחת מערכת סטטיסטית. קובץ הכותרת הוא קובץ ספריית הקלט/הפלט הסטנדרטי, כך שתוכל להשתמש ב- printf או scanf בקוד C שלך.

דוגמא 2:

בקוד הבא אנו הולכים לקבל מידע על הקובץ באמצעות קריאת מערכת סטטוס:

קוד:

#לִכלוֹל
#לִכלוֹל
#לִכלוֹל
#לִכלוֹל

בָּטֵלsfile(לְהַשְׁחִיר קבועשם קובץ[]);

intרָאשִׁי(){
גודל_אינך קורא;
לְהַשְׁחִיר*בַּלָם= 0;
גודל_טגודל buf= 0;

printf ('הזן את שם הקובץ כדי לבדוק: n');
לקרוא=getline(&בַּלָם, &גודל buf,stdin);

אם (לקרוא<=0 ){
printf ('getline נכשל n');
יְצִיאָה (1);
}

אם (בַּלָם[לקרוא-1] == ' n'){
בַּלָם[לקרוא-1] = 0;
}

intש=לִפְתוֹחַ(בַּלָם,O_RDONLY);
אם(ש== -1){
printf ('הקובץ לא קיים n');
יְצִיאָה (1);
}
אַחֵר{
sfile(בַּלָם);
}
חינם (בַּלָם);
לַחֲזוֹר 0;
}

בָּטֵלsfile(לְהַשְׁחִיר קבועשם קובץ[]){

מבנההמדינה sfile;

אם(מדינה(שם קובץ, &sfile)== -1){
printf ('אירעה שגיאה n');
}

// גישה לחברי נתונים של stat struct
printf (' nקובץ st_uid %d n',sfile.st_uid);
printf (' nקובץ st_blksize %ld n',sfile.st_blksize);
printf (' nקובץ st_gid %d n',sfile.st_gid);
printf (' nקובץ st_blocks %ld n',sfile.st_blocks);
printf (' nקובץ st_size %ld n',sfile.גודל_גודל);
printf (' nקובץ st_nlink% u n',(ללא חתימה int)sfile.st_nlink);
printf (' nמשתמש הרשאות קבצים n');
printf ((sfile.st_mode &S_IRUSR)? 'ר':'-');
printf ((sfile.st_mode &S_IWUSR)? 'ב':'-');
printf ((sfile.st_mode &S_IXUSR)? 'איקס':'-');
printf (' n');
printf (' nקבוצת הרשאות קבצים n');
printf ((sfile.st_mode &S_IRGRP)? 'ר':'-');
printf ((sfile.st_mode &S_IWGRP)? 'ב':'-');
printf ((sfile.st_mode &S_IXGRP)? 'איקס':'-');
printf (' n');
printf (' nהרשאות קבצים אחרות n');
printf ((sfile.st_mode &S_IROTH)? 'ר':'-');
printf ((sfile.st_mode &S_IWOTH)? 'ב':'-');
printf ((sfile.st_mode &S_IXOTH)? 'איקס':'-');
printf (' n');
}

תְפוּקָה:

בקוד C לעיל, הכנסנו את שם הקובץ ואם הקובץ אינו קיים הרי שהביצוע של התוכנית יופסק. זה מודגם בתמונה הבאה:

אם הקובץ שלנו קיים, הפונקציה sfile (n) תיקרא בה העברנו את שם הקובץ. בתוך הפונקציה, קודם כל השתמשנו בשיחת מערכת Stat, אם stat () מחזיר -1 אז חייבת e כל שגיאה אז הודעה תודפס והפעלת התוכנית תיפסק.

אז בהצהרת printf השתמשנו בשם הפונקציה ומפריד הנקודות כדי לגשת לחברי הנתונים של stat struct .

לאחר מכן עבור מצב הקובץ ניגשנו לפקודות המאקרו או הדגלים של st_mode. כאן משתמשים בהגיון ובאופרטור להדפסת המצבים המתאימים. בדקנו הרשאות למשתמש, לקבוצה ואחרים לגבי הקובץ שצוין (שם הקובץ שהוזן על ידי משתמש).

בעזרת זה אתה יכול לראות כיצד להשתמש בשיחת מערכת stat משפת התכנות C כדי לקבל מידע מגרעין מערכת ההפעלה על קבצים. אם יש לך שאלה אל תהסס ספר לנו באמצעות סעיף ההערות.