Stat System Call Linux Tutorial

Stat System Call Linux Tutorial



Các lệnh gọi hệ thống do nhân linux cung cấp được hiển thị trong ngôn ngữ lập trình C thông qua glibc. Khi một lệnh gọi hệ thống được sử dụng, bạn đang giao tiếp với HĐH và ngược lại HĐH sẽ giao tiếp với bạn thông qua các tham số được trả về cho các hàm gọi hệ thống (giá trị trả về).

Cuộc gọi hệ thống thống kê:

Lệnh gọi hệ thống Stat là một lệnh gọi hệ thống trong Linux để kiểm tra trạng thái của tệp, chẳng hạn như kiểm tra thời điểm tệp được truy cập. Lệnh gọi hệ thống stat () thực sự trả về các thuộc tính tệp. Các thuộc tính tệp của một inode về cơ bản được trả về bởi hàm Stat (). Một inode chứa siêu dữ liệu của tệp. Một inode chứa: loại tệp, kích thước của tệp, thời điểm tệp được truy cập (sửa đổi, xóa), nhãn thời gian và đường dẫn của tệp, ID người dùng và ID nhóm, các liên kết của tệp và địa chỉ thực của nội dung tệp.







Chúng ta có thể nói rằng inode chứa tất cả dữ liệu cần thiết cho lệnh gọi hệ thống stat () và nó là số chỉ mục cho tệp được lưu trong bảng inode. Bất cứ khi nào bạn tạo một tệp, một số inode cho tệp đó sẽ được tạo. Sử dụng hệ thống stat gọi các bảng hệ thống có thể được xem.



Cú pháp của lệnh gọi hệ thống C Stat:

Để sử dụng lệnh gọi hệ thống thống kê trong ngôn ngữ lập trình C, bạn phải bao gồm tệp tiêu đề sau:



#bao gồm

Stat được sử dụng để lấy trạng thái của một tập tin. Cú pháp của lệnh gọi hệ thống C stat có thể không giống nhau đối với mọi hệ điều hành. Trong Linux, cú pháp cho lệnh gọi hệ thống stat như sau:





NStiểu bang(hăng sô char *con đường, cấu trúctiểu bang*buf)

Kiểu trả về của hàm trong int, nếu hàm được thực thi thành công, trả về 0 nếu có lỗi, -1 sẽ được trả về.

Ở đây đường dẫn const char * chỉ định tên của tệp. Nếu đường dẫn của tệp là một liên kết tượng trưng thì bạn cần chỉ định liên kết thay vì tên tệp.



Sau đó, trong hàm chúng ta có cấu trúc trạng thái trong đó dữ liệu hoặc thông tin về tệp được lưu trữ sử dụng một con trỏ có tên buf, được chuyển vào dưới dạng paramteter và được điền vào trong quá trình thực hiện cuộc gọi và người dùng có thể đọc được sau cuộc gọi.

Cấu trúc Stat:

Cấu trúc thống kê được xác định trong tệp tiêu đề chứa các trường sau:

cấu trúctiểu bang
{
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;
cấu trúctimspec st_atim;
cấu trúctimspec st_mtim;
cấu trúctimspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};

Sự miêu tả:

  1. st_dev: Nó là ID của thiết bị mà chúng tôi có tệp của chúng tôi hiện đang cư trú.
  2. st_rdev: Trường này mô tả rằng một tệp cụ thể đại diện cho một thiết bị cụ thể.
  3. st_ino: Nó là số inode hoặc số sê-ri của tệp. Vì nó là số chỉ mục nên nó phải là số duy nhất cho tất cả các tệp
  4. st_size: st_size là kích thước của tệp tính bằng byte.
  5. st_atime: Đây là lần cuối cùng hoặc lần gần đây mà tệp được truy cập.
  6. st_ctime: Đây là thời gian gần đây mà trạng thái hoặc quyền của tệp đã được thay đổi.
  7. st_mtime: Đây là thời gian gần đây mà tệp đã được sửa đổi.
  8. st_blksize: Trường này cung cấp kích thước khối ưu tiên cho hệ thống tệp I / O có thể khác nhau giữa các tệp.
  9. st_blocks: Trường này cho biết tổng số khối theo bội số của 512 byte.
  10. st_nlink: Trường này cho biết tổng số liên kết cứng.
  11. st_uid: Trường này cho biết ID người dùng.
  12. st_gid: Trường này cho biết ID nhóm.
  13. st_mode: Nó cho biết các quyền trên tệp, cho biết các chế độ trên tệp. Sau đây là các cờ cần được xác định cho trường st_mode:
Cờ Sự miêu tả Giá trị cờ
S_IFMT Mặt nạ bit được sử dụng để nhận giá trị chế độ của tệp 0170000
S_IFSOCK Một hằng số tệp của socket 0140000
S_IFLINK Một hằng số tệp của liên kết tượng trưng 0120000
S_IFREG Tệp không đổi cho tệp thông thường 0100000
S_IFBLK Hằng số tệp cho tệp khối 0060000
S_IFDIR Hằng số tệp cho tệp thư mục 0040000
S_IFCHR Hằng số tệp cho tệp ký tự 0020000
S_IFIFO Một hằng số của tệp là 50o 0010000
S_ISUID Đặt bit ID người dùng 0004000
S_ISGID Đặt bit ID nhóm 0002000
S_ISVTX Bit dính biểu thị văn bản được chia sẻ 0001000
S_IRWXU Quyền của chủ sở hữu (đọc, ghi, thực thi) 00700
S_IRUSR Quyền đọc cho chủ sở hữu 00400
S_IWUSR Viết quyền cho chủ sở hữu 00200
S_IXUSR Thực thi quyền cho chủ sở hữu 00100
S_IRWXG Quyền nhóm (đọc, ghi, thực thi) 00070
S_IRGRP Quyền đọc cho nhóm 00040
S_IWGRP Viết quyền cho nhóm 00020
S_IXGRP Thực thi quyền cho nhóm 00010
S_IRWXO Quyền cho người khác (đọc, viết, thực thi) 00007
S_IROTH Quyền đọc cho người khác 00004
S_IWOTH Viết quyền cho người khác 00002
S_IXOTH Thực thi quyền cho người khác 00001

Cách sử dụng lệnh gọi hệ thống Stat:

Ví dụ sau đây cho thấy cách sử dụng lệnh gọi hệ thống stat trong ngôn ngữ lập trình C trong Linux, Ubuntu.

VÍ DỤ 1:

Trong đoạn mã sau, chúng ta sẽ tìm chế độ của một tệp:

MÃ SỐ:

#bao gồm
#bao gồm
NSchủ chốt()
{
// con trỏ tới cấu trúc stat
cấu trúctiểu bang sfile;

// lệnh gọi hệ thống stat
tiểu bang('stat.c', &sfile);

// truy cập st_mode (thành viên dữ liệu của cấu trúc stat)
printf ('st_mode =% o',sfile.st_mode);
trở lại 0;
}

Biên dịch và chạy chương trình trả về như sau:

Trong đoạn mã này, chúng ta đã chuyển tên của tệp trong lệnh gọi hệ thống stat và sau đó là con trỏ tới cấu trúc stat là sfile. Sau đó, con trỏ tới cấu trúc stat được sử dụng để truy cập st_mode hiển thị chế độ của tệp bằng cách sử dụng câu lệnh printf.

Tệp tiêu đề được sử dụng để bạn có thể sử dụng lệnh gọi hệ thống thống kê. Tệp tiêu đề là tệp thư viện đầu vào / đầu ra tiêu chuẩn để bạn có thể sử dụng printf hoặc scanf trong mã C của mình.

VÍ DỤ 2:

Trong đoạn mã sau, chúng ta sẽ lấy thông tin về tệp bằng lệnh gọi hệ thống stat:

MÃ SỐ:

#bao gồm
#bao gồm
#bao gồm
#bao gồm

vô hiệusfile(char hăng sôtên tập tin[]);

NSchủ chốt(){
ssize_t đã đọc;
char*đệm= 0;
size_tbuf_size= 0;

printf ('Nhập tên của tệp để kiểm tra: ');
đọc=theo hàng(&đệm, &buf_size,stdin);

nếu như (đọc<=0 ){
printf ('getline thất bại ');
lối ra (1);
}

nếu như (đệm[đọc-1] == ' '){
đệm[đọc-1] = 0;
}

NSNS=mở ra(đệm,O_RDONLY);
nếu như(NS== -1){
printf ('Tệp không tồn tại ');
lối ra (1);
}
khác{
sfile(đệm);
}
miễn phí (đệm);
trở lại 0;
}

vô hiệusfile(char hăng sôtên tập tin[]){

cấu trúctiểu bang sfile;

nếu như(tiểu bang(tên tập tin&sfile)== -1){
printf ('Xảy ra lỗi ');
}

// Truy cập các thành viên dữ liệu của cấu trúc stat
printf (' Tệp st_uid% d ',sfile.st_uid);
printf (' Tệp st_blksize% ld ',sfile.st_blksize);
printf (' Tệp st_gid% d ',sfile.st_gid);
printf (' Tệp st_blocks% ld ',sfile.st_blocks);
printf (' Tệp st_size% ld ',sfile.st_size);
printf (' Tệp st_nlink% u ',(chưa ký NS)sfile.st_nlink);
printf (' Người dùng quyền đối với tệp ');
printf ((sfile.st_mode &S_IRUSR)? 'NS':'-');
printf ((sfile.st_mode &S_IWUSR)? 'trong':'-');
printf ((sfile.st_mode &S_IXUSR)? 'NS':'-');
printf (' ');
printf (' Nhóm quyền đối với tệp ');
printf ((sfile.st_mode &S_IRGRP)? 'NS':'-');
printf ((sfile.st_mode &S_IWGRP)? 'trong':'-');
printf ((sfile.st_mode &S_IXGRP)? 'NS':'-');
printf (' ');
printf (' Quyền đối với tệp Khác ');
printf ((sfile.st_mode &S_IROTH)? 'NS':'-');
printf ((sfile.st_mode &S_IWOTH)? 'trong':'-');
printf ((sfile.st_mode &S_IXOTH)? 'NS':'-');
printf (' ');
}

ĐẦU RA:

Trong đoạn mã C ở trên, chúng ta đã nhập tên tệp và nếu tệp không tồn tại thì quá trình thực hiện chương trình sẽ bị dừng. Điều này được thể hiện qua hình ảnh sau:

Nếu tệp của chúng ta tồn tại, hàm sfile (n) sẽ được gọi trong đó chúng ta đã chuyển tên của tệp. Bên trong hàm, trước hết chúng ta đã sử dụng lệnh gọi hệ thống Stat, nếu stat () trả về -1 thì chắc chắn sẽ có lỗi xảy ra nên một thông báo sẽ được in ra và việc thực hiện chương trình sẽ bị dừng lại.

Sau đó, trong câu lệnh printf, chúng tôi đã sử dụng tên của hàm và dấu phân cách để truy cập các thành viên dữ liệu của cấu trúc thống kê .

Sau đó, đối với chế độ tệp, chúng tôi đã truy cập vào macro hoặc cờ của st_mode. Ở đây toán tử và logic được sử dụng để in các chế độ tương ứng. Chúng tôi đã kiểm tra quyền cho người dùng, nhóm và những người khác đối với tệp được chỉ định (tên tệp do người dùng nhập).

Với điều này, bạn có thể thấy cách sử dụng lệnh gọi hệ thống stat từ ngôn ngữ lập trình C để lấy thông tin từ nhân hệ điều hành về các tệp. Nếu bạn có câu hỏi, hãy cho chúng tôi biết qua phần bình luận.