Stat System Call Linux Tutorial

Stat System Call Linux Tutorial



การเรียกระบบโดยเคอร์เนล linux จะแสดงในภาษาการเขียนโปรแกรม C ผ่าน glibc เมื่อใช้การเรียกระบบ คุณกำลังสื่อสารกับ OS และเมื่อกลับมา OS จะสื่อสารกับคุณผ่านพารามิเตอร์ที่ส่งคืนไปยังฟังก์ชันการเรียกระบบ (คืนค่า)

ระบบสถิติการโทร:

Stat system call เป็นการเรียกระบบใน Linux เพื่อตรวจสอบสถานะของไฟล์ เช่น ตรวจสอบว่ามีการเข้าถึงไฟล์เมื่อใด การเรียกระบบ stat() จะคืนค่าแอตทริบิวต์ของไฟล์ คุณสมบัติไฟล์ของ inode นั้นโดยทั่วไปจะส่งคืนโดยฟังก์ชัน Stat() ไอโหนดมีข้อมูลเมตาของไฟล์ ไอโหนดประกอบด้วย: ประเภทของไฟล์, ขนาดของไฟล์, เมื่อเข้าถึงไฟล์ (แก้ไข, ลบ) ที่มีการประทับเวลา, และเส้นทางของไฟล์, ID ผู้ใช้และ ID กลุ่ม, ลิงค์ของไฟล์ และที่อยู่จริงของเนื้อหาไฟล์







เราสามารถพูดได้ว่า inode มีข้อมูลทั้งหมดที่จำเป็นสำหรับการเรียกระบบ stat() และเป็นหมายเลขดัชนีสำหรับไฟล์ที่บันทึกไว้ในตาราง inode เมื่อใดก็ตามที่คุณสร้างไฟล์ หมายเลขไอโหนดสำหรับไฟล์นั้นจะถูกสร้างขึ้น การใช้ระบบสถิติสามารถดูตารางระบบได้



ไวยากรณ์ของการเรียกระบบ C Stat:

ในการใช้การเรียกระบบ stat ในภาษาการเขียนโปรแกรม C คุณต้องรวมไฟล์ส่วนหัวต่อไปนี้:



#รวม

Stat ใช้เพื่อรับสถานะของไฟล์ ไวยากรณ์ของการเรียกระบบ C stat อาจไม่เหมือนกันสำหรับทุกระบบปฏิบัติการ ใน Linux ไวยากรณ์สำหรับการเรียกระบบสถิติมีดังนี้:





intสถานะ(const char *เส้นทาง, โครงสร้างสถานะ*บัฟ)

ประเภทการส่งคืนของฟังก์ชันเป็น int หากฟังก์ชันทำงานสำเร็จ ระบบจะส่งคืน 0 หากมีข้อผิดพลาด -1 จะถูกส่งกลับ

ที่นี่ อักขระ const *เส้นทาง ระบุชื่อของไฟล์ หากเส้นทางของไฟล์เป็นลิงก์สัญลักษณ์ คุณต้องระบุลิงก์แทนชื่อไฟล์



จากนั้นในฟังก์ชัน เรามีโครงสร้างสถิติที่เก็บข้อมูลหรือข้อมูลเกี่ยวกับไฟล์ซึ่งใช้ตัวชี้ชื่อ บัฟ ซึ่งถูกส่งผ่านเป็นพารามิเตอร์และกรอกข้อมูลในระหว่างการโทรและผู้ใช้สามารถอ่านได้หลังจากการโทร

โครงสร้างสถิติ:

โครงสร้างสถิติที่กำหนดไว้ในไฟล์ส่วนหัวประกอบด้วยฟิลด์ต่อไปนี้:

โครงสร้างสถานะ
{
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: เป็น ID ของอุปกรณ์ที่เรามีไฟล์อยู่ในขณะนี้
  2. st_rdev: ฟิลด์นี้อธิบายว่าไฟล์ใดไฟล์หนึ่งแสดงถึงอุปกรณ์เฉพาะ
  3. st_ino: เป็นหมายเลขไอโหนดหรือหมายเลขซีเรียลของไฟล์ เนื่องจากเป็นหมายเลขดัชนีจึงควรไม่ซ้ำกันสำหรับไฟล์ทั้งหมด
  4. st_size: st_size คือขนาดของไฟล์เป็นไบต์
  5. st_atime: เป็นครั้งสุดท้ายหรือครั้งล่าสุดที่มีการเข้าถึงไฟล์
  6. st_cเวลา: เป็นเวลาล่าสุดที่สถานะหรือการอนุญาตของไฟล์มีการเปลี่ยนแปลง
  7. st_mเวลา: เป็นเวลาล่าสุดที่ไฟล์ถูกแก้ไข
  8. st_blkขนาด: ฟิลด์นี้ให้ขนาดบล็อกที่ต้องการสำหรับระบบไฟล์ I/O ซึ่งอาจแตกต่างกันไปในแต่ละไฟล์
  9. st_blocks: ฟิลด์นี้บอกจำนวนบล็อกทั้งหมดเป็นทวีคูณ 512 ไบต์
  10. st_nlink: ฟิลด์นี้บอกจำนวนฮาร์ดลิงก์ทั้งหมด
  11. st_uid: ฟิลด์นี้ระบุ ID ผู้ใช้
  12. st_gid: ฟิลด์นี้ระบุ ID กลุ่ม
  13. st_mode: ระบุสิทธิ์ในไฟล์ บอกโหมดต่างๆ ในไฟล์ ต่อไปนี้เป็นแฟล็กที่ควรกำหนดสำหรับฟิลด์ st_mode:
ธง คำอธิบาย ค่าธง
S_IFMT บิตมาสก์ที่ใช้รับค่าโหมดของไฟล์ 0170000
S_IFSOCK ค่าคงที่ไฟล์ของ socket 0140000
S_IFLINK ค่าคงที่ไฟล์ของลิงก์สัญลักษณ์ 012000
S_IFREG ค่าคงที่ของไฟล์สำหรับไฟล์ปกติ 0100000
S_IFBLK ค่าคงที่ของไฟล์สำหรับไฟล์บล็อก 0060000
S_IFDIR ค่าคงที่ของไฟล์สำหรับไฟล์ไดเร็กทอรี 0040000
S_IFCHR ค่าคงที่ไฟล์สำหรับไฟล์อักขระ 0020000
S_IFIFO ค่าคงที่ไฟล์ของ fifo 0010000
S_ISUID ตั้งค่า User ID bit 0004000
S_ISGID ตั้งค่า ID กลุ่ม bit 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;

//สถิติการเรียกระบบ
สถานะ('สถิติ.c', &sfile);

// การเข้าถึง st_mode (สมาชิกข้อมูลของ stat struct)
printf ('st_mode = %o',สไฟล์st_mode);
กลับ 0;
}

การคอมไพล์และรันโปรแกรมจะส่งคืนดังนี้:

ในโค้ดนี้ เราได้ส่งชื่อไฟล์ในการเรียกระบบ stat แล้วตามด้วยตัวชี้ไปยัง stat struct ซึ่งเป็น sfile ตัวชี้ไปยังโครงสร้าง stat จะถูกใช้เพื่อเข้าถึง st_mode ซึ่งแสดงโหมดของไฟล์โดยใช้คำสั่ง printf

ไฟล์ส่วนหัวถูกใช้เพื่อให้คุณสามารถใช้การเรียกระบบสถิติ ไฟล์ส่วนหัวเป็นไฟล์ไลบรารีอินพุต/เอาต์พุตมาตรฐาน เพื่อให้คุณสามารถใช้ printf หรือ scanf ในโค้ด C ของคุณได้

ตัวอย่างที่ 2:

ในโค้ดต่อไปนี้ เราจะรับข้อมูลเกี่ยวกับไฟล์โดยใช้การเรียกระบบ stat:

รหัส:

#รวม
#รวม
#รวม
#รวม

โมฆะsfile(char constชื่อไฟล์[]);

intหลัก(){
ssize_t อ่าน;
char*กันชน= 0;
size_tbuf_size= 0;

printf ('ป้อนชื่อไฟล์เพื่อตรวจสอบ:NS');
อ่าน=getline(&กันชน, &buf_size,stdin);

ถ้า (อ่าน<=0 ){
printf ('getline ล้มเหลวNS');
ทางออก (1);
}

ถ้า (กันชน[อ่าน-1] == 'NS'){
กันชน[อ่าน-1] = 0;
}

intNS=เปิด(กันชน,O_RDONLY);
ถ้า(NS== -1){
printf ('ไฟล์ไม่มีอยู่NS');
ทางออก (1);
}
อื่น{
sfile(กันชน);
}
ฟรี (กันชน);
กลับ 0;
}

โมฆะsfile(char constชื่อไฟล์[]){

โครงสร้างสถานะ sfile;

ถ้า(สถานะ(ชื่อไฟล์, &sfile)== -1){
printf ('เกิดข้อผิดพลาดขึ้นNS');
}

//การเข้าถึงข้อมูลสมาชิกของ stat struct
printf ('NSไฟล์ st_uid %dNS',สไฟล์st_uid);
printf ('NSไฟล์ st_blksize %ldNS',สไฟล์st_blksize);
printf ('NSไฟล์ st_gid %dNS',สไฟล์st_gid);
printf ('NSไฟล์ st_blocks %ldNS',สไฟล์st_blocks);
printf ('NSไฟล์ st_size %ldNS',สไฟล์st_size);
printf ('NSไฟล์ st_nlink% uNS',(ไม่ได้ลงนาม int)สไฟล์st_nlink);
printf ('NSผู้ใช้สิทธิ์ไฟล์NS');
printf ((สไฟล์st_mode &S_IRUSR)? 'NS':'-');
printf ((สไฟล์st_mode &S_IWUSR)? 'ใน':'-');
printf ((สไฟล์st_mode &S_IXUSR)? 'NS':'-');
printf ('NS');
printf ('NSกลุ่มสิทธิ์ไฟล์NS');
printf ((สไฟล์st_mode &S_IRGRP)? 'NS':'-');
printf ((สไฟล์st_mode &S_IWGRP)? 'ใน':'-');
printf ((สไฟล์st_mode &S_IXGRP)? 'NS':'-');
printf ('NS');
printf ('NSสิทธิ์ของไฟล์ อื่นๆNS');
printf ((สไฟล์st_mode &S_IROTH)? 'NS':'-');
printf ((สไฟล์st_mode &S_IWOTH)? 'ใน':'-');
printf ((สไฟล์st_mode &S_IXOTH)? 'NS':'-');
printf ('NS');
}

เอาท์พุท:

ในโค้ด C ด้านบน เราได้ป้อนชื่อไฟล์แล้ว และหากไม่มีไฟล์อยู่ การดำเนินการของโปรแกรมจะหยุดลง สิ่งนี้แสดงให้เห็นในภาพต่อไปนี้:

หากไฟล์ของเรามีอยู่ ฟังก์ชัน sfile(n) จะถูกเรียกใช้โดยที่เราได้ส่งชื่อไฟล์ไปแล้ว ภายในฟังก์ชัน ก่อนอื่นเราใช้การเรียกระบบ Stat หาก stat() คืนค่า -1 แสดงว่าต้องมีข้อผิดพลาดใด ๆ ดังนั้นข้อความจะถูกพิมพ์และการดำเนินการของโปรแกรมจะหยุดลง

จากนั้นในคำสั่ง printf เราได้ใช้ชื่อของฟังก์ชันและตัวคั่นจุดเพื่อเข้าถึงสมาชิกของข้อมูลของ โครงสร้างสถิติ .

จากนั้นสำหรับโหมดของไฟล์ เราได้เข้าถึงมาโครหรือแฟล็กของ st_mode ที่นี่ใช้ตรรกะและตัวดำเนินการเพื่อพิมพ์โหมดที่เกี่ยวข้อง เราได้ตรวจสอบการอนุญาตสำหรับผู้ใช้ กลุ่ม และอื่นๆ สำหรับไฟล์ที่ระบุ (ชื่อไฟล์ที่ผู้ใช้ป้อน)

ด้วยสิ่งนี้ คุณสามารถดูวิธีการใช้การเรียกระบบสถิติจากภาษาการเขียนโปรแกรม C เพื่อรับข้อมูลจากเคอร์เนล OS เกี่ยวกับไฟล์ หากคุณมีคำถามโปรดแจ้งให้เราทราบผ่านทางส่วนความคิดเห็น