Stat System Call Linux Tutorial

Stat System Call Linux Tutorial



Οι κλήσεις συστήματος που παρέχονται από τον πυρήνα linux εκτίθενται στη γλώσσα προγραμματισμού C μέσω glibc. Όταν χρησιμοποιείται μια κλήση συστήματος, επικοινωνείτε με το λειτουργικό σύστημα και κατά την επιστροφή το λειτουργικό σύστημα σας επικοινωνεί μέσω των παραμέτρων που επιστρέφονται στις λειτουργίες κλήσης συστήματος (τιμές επιστροφής).

Stat System Call:

Η κλήση συστήματος Stat είναι μια κλήση συστήματος στο Linux για να ελέγξετε την κατάσταση ενός αρχείου, όπως να ελέγξετε πότε έγινε πρόσβαση στο αρχείο. Η κλήση συστήματος () επιστρέφει στην πραγματικότητα χαρακτηριστικά αρχείου. Τα χαρακτηριστικά αρχείου ενός inode επιστρέφονται βασικά με τη συνάρτηση Stat (). Ένα inode περιέχει τα μεταδεδομένα του αρχείου. Ένα inode περιέχει: τον τύπο του αρχείου, το μέγεθος του αρχείου, όταν έγινε πρόσβαση στο αρχείο (τροποποιήθηκε, διαγράφηκε), δηλαδή χρονικές σφραγίδες, και τη διαδρομή του αρχείου, το αναγνωριστικό χρήστη και το αναγνωριστικό ομάδας, συνδέσμους του αρχείου και φυσική διεύθυνση περιεχομένου αρχείου.







Μπορούμε να πούμε ότι το inode περιέχει όλα τα δεδομένα που απαιτούνται για την κλήση συστήματος () και είναι ο αριθμός ευρετηρίου για το αρχείο που αποθηκεύεται στον πίνακα inode. Κάθε φορά που δημιουργείτε ένα αρχείο δημιουργείται ένας αριθμός inode για αυτό το αρχείο. Χρησιμοποιώντας stat system call μπορείτε να δείτε τους πίνακες συστήματος.



Σύνταξη της κλήσης συστήματος C Stat:

Για να χρησιμοποιήσετε την κλήση συστήματος stat στη γλώσσα προγραμματισμού C, πρέπει να συμπεριλάβετε το ακόλουθο αρχείο κεφαλίδας:



#περιλαμβάνω

Το Stat χρησιμοποιείται για να λάβετε την κατάσταση ενός αρχείου. Η σύνταξη της κλήσης συστήματος C stat ενδέχεται να μην είναι η ίδια για κάθε λειτουργικό σύστημα. Στο Linux, η σύνταξη για την κλήση συστήματος stat έχει ως εξής:





intκατάσταση(const απανθρακώνω *μονοπάτι, δομήκατάσταση*μπουφ)

Ο τύπος επιστροφής της συνάρτησης στο int, εάν η συνάρτηση εκτελεστεί με επιτυχία, επιστρέφεται 0 εάν υπάρχουν σφάλματα, -1 επιστρέφεται.

Εδώ const char *διαδρομή καθορίζει το όνομα του αρχείου. Εάν η διαδρομή του αρχείου είναι ένας συμβολικός σύνδεσμος, τότε πρέπει να καθορίσετε τον σύνδεσμο αντί για το όνομα του αρχείου.



Στη συνέχεια, στη συνάρτηση έχουμε μια δομή stat στην οποία αποθηκεύονται τα δεδομένα ή οι πληροφορίες σχετικά με το αρχείο που χρησιμοποιεί έναν δείκτη με το όνομα μπουφ, το οποίο μεταβιβάζεται ως παράμετρος και συμπληρώνεται κατά την εκτέλεση της κλήσης και διαβάζεται από τον χρήστη μετά την κλήση.

Δομή Stat:

Η δομή 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 είναι το μέγεθος του αρχείου σε byte.
  5. st_atime: Είναι η τελευταία ή η πρόσφατη ώρα κατά την οποία έγινε πρόσβαση στο αρχείο.
  6. st_ctime: Είναι ο πρόσφατος χρόνος κατά τον οποίο άλλαξε η κατάσταση ή τα δικαιώματα του αρχείου.
  7. st_mtime: Είναι η πρόσφατη στιγμή κατά την οποία το αρχείο τροποποιήθηκε.
  8. st_blksize: Αυτό το πεδίο δίνει το προτιμώμενο μέγεθος μπλοκ για το σύστημα αρχείων εισόδου/εξόδου, το οποίο μπορεί να διαφέρει από αρχείο σε αρχείο.
  9. st_blocks: Αυτό το πεδίο δείχνει τον συνολικό αριθμό μπλοκ πολλαπλάσια των 512 byte.
  10. st_nlink: Αυτό το πεδίο αναφέρει τον συνολικό αριθμό των σκληρών συνδέσμων.
  11. st_uid: Αυτό το πεδίο υποδεικνύει το αναγνωριστικό χρήστη.
  12. st_gid: Αυτό το πεδίο υποδεικνύει το αναγνωριστικό ομάδας.
  13. st_mode: Υποδεικνύει τα δικαιώματα στο αρχείο, λέει τις λειτουργίες σε ένα αρχείο. Ακολουθούν οι σημαίες που πρέπει να οριστούν για το πεδίο st_mode:
Σημαίες Περιγραφή Τιμή σημαίας
S_IFMT Ένα bitmask που χρησιμοποιείται για να λάβει την τιμή λειτουργίας ενός αρχείου 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 Ορίστε το bit User ID 0004000
S_ISGID Ορίστε 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:

Το ακόλουθο παράδειγμα δείχνει πώς να χρησιμοποιήσετε την κλήση συστήματος συστήματος στη γλώσσα προγραμματισμού C στο Linux, Ubuntu.

ΠΑΡΑΔΕΙΓΜΑ 1:

Στον ακόλουθο κώδικα θα βρούμε τη λειτουργία ενός αρχείου:

ΚΩΔΙΚΑΣ:

#περιλαμβάνω
#περιλαμβάνω
intκύριος()
{
// δείκτης σε stat strukt
δομήκατάσταση sfile?

// stat κλήση συστήματος
κατάσταση('stat.c', &ασταθής)?

// πρόσβαση στο st_mode (μέλος δεδομένων του stat struct)
printf ('st_mode = %o',ασταθής.st_mode)?
ΕΠΙΣΤΡΟΦΗ 0?
}

Η σύνταξη και εκτέλεση του προγράμματος επιστρέφει ως εξής:

Σε αυτόν τον κώδικα, έχουμε περάσει το όνομα του αρχείου στην κλήση συστήματος stat και στη συνέχεια τον δείκτη στο stat struct που είναι sfile. Ο δείκτης προς το stat struct χρησιμοποιείται στη συνέχεια για πρόσβαση στο st_mode που εμφανίζει τη λειτουργία του αρχείου χρησιμοποιώντας την εντολή printf.

Το αρχείο κεφαλίδας χρησιμοποιείται για να μπορείτε να χρησιμοποιήσετε την κλήση συστήματος stat. Το αρχείο κεφαλίδας είναι το τυπικό αρχείο βιβλιοθήκης εισόδου/εξόδου, ώστε να μπορείτε να χρησιμοποιήσετε printf ή scanf στον κωδικό C σας.

ΠΑΡΑΔΕΙΓΜΑ 2:

Στον ακόλουθο κώδικα πρόκειται να λάβουμε πληροφορίες σχετικά με το αρχείο χρησιμοποιώντας την κλήση συστήματος stat:

ΚΩΔΙΚΑΣ:

#περιλαμβάνω
#περιλαμβάνω
#περιλαμβάνω
#περιλαμβάνω

κενόςασταθής(απανθρακώνω constόνομα αρχείου[])?

intκύριος(){
ssize_t διαβάστε?
απανθρακώνω*ρυθμιστής= 0?
μέγεθος_τbuf_size= 0?

printf ('Εισαγάγετε το όνομα ενός αρχείου για έλεγχο: n')?
ανάγνωση=getline(&ρυθμιστής, &buf_size,stdin)?

αν (ανάγνωση<=0 ){
printf (Το getline απέτυχε n')?
έξοδος (1)?
}

αν (ρυθμιστής[ανάγνωση-1] == ' n'){
ρυθμιστής[ανάγνωση-1] = 0?
}

intμικρό=Άνοιξε(ρυθμιστής,O_RDONLY)?
αν(μικρό== -1){
printf ('Το αρχείο δεν υπάρχει n')?
έξοδος (1)?
}
αλλού{
ασταθής(ρυθμιστής)?
}
Ελεύθερος (ρυθμιστής)?
ΕΠΙΣΤΡΟΦΗ 0?
}

κενόςασταθής(απανθρακώνω constόνομα αρχείου[]){

δομήκατάσταση sfile?

αν(κατάσταση(όνομα αρχείου, &ασταθής)== -1){
printf ('Προέκυψε σφάλμα n')?
}

// Πρόσβαση στα δεδομένα δεδομένων του stat struct
printf (' nΑρχείο st_uid %d n',ασταθής.st_uid)?
printf (' nΑρχείο st_blksize %ld n',ασταθής.st_blksize)?
printf (' nΑρχείο st_gid %d n',ασταθής.st_gid)?
printf (' nΑρχείο st_blocks %ld n',ασταθής.st_blocks)?
printf (' nΑρχείο st_size %ld n',ασταθής.st_size)?
printf (' nΑρχείο st_nlink% u n',(ανυπόγραφο int)ασταθής.st_nlink)?
printf (' nΔικαιώματα αρχείου χρήστη n')?
printf ((ασταθής.st_mode &S_IRUSR); 'r':'-')?
printf ((ασταθής.st_mode &S_IWUSR); 'σε':'-')?
printf ((ασταθής.st_mode &S_IXUSR); 'Χ':'-')?
printf (' n')?
printf (' nΟμάδα δικαιωμάτων αρχείου n')?
printf ((ασταθής.st_mode &S_IRGRP); 'r':'-')?
printf ((ασταθής.st_mode &S_IWGRP); 'σε':'-')?
printf ((ασταθής.st_mode &S_IXGRP); 'Χ':'-')?
printf (' n')?
printf (' nΆδειες αρχείου Άλλα n')?
printf ((ασταθής.st_mode &S_IROTH); 'r':'-')?
printf ((ασταθής.st_mode &S_IWOTH); 'σε':'-')?
printf ((ασταθής.st_mode &S_IXOTH); 'Χ':'-')?
printf (' n')?
}

ΠΑΡΑΓΩΓΗ:

Στον παραπάνω κωδικό C, έχουμε εισαγάγει το όνομα του αρχείου και εάν το αρχείο δεν υπάρχει τότε η εκτέλεση του προγράμματος θα διακοπεί. Αυτό αποδεικνύεται στην παρακάτω εικόνα:

Εάν το αρχείο μας υπάρχει, θα κληθεί η συνάρτηση sfile (n) στην οποία έχουμε περάσει το όνομα του αρχείου. Μέσα στη συνάρτηση, πρώτα από όλα έχουμε χρησιμοποιήσει την κλήση συστήματος Stat, αν το stat () επιστρέψει -1 τότε πρέπει να υπάρχει οποιοδήποτε σφάλμα, ώστε να εκτυπωθεί ένα μήνυμα και να σταματήσει η εκτέλεση του προγράμματος.

Στη συνέχεια, στη δήλωση printf χρησιμοποιήσαμε το όνομα της συνάρτησης και του διαχωριστή κουκκίδων για πρόσβαση στα μέλη των δεδομένων stat strukt Το

Στη συνέχεια, για τον τρόπο αρχείου έχουμε πρόσβαση στις μακροεντολές ή στις σημαίες του st_mode. Εδώ χρησιμοποιείται το λογικό και ο τελεστής για την εκτύπωση των αντίστοιχων λειτουργιών. Έχουμε ελέγξει για δικαιώματα χρήστη, ομάδας και άλλων για το καθορισμένο αρχείο (όνομα αρχείου που έχει εισαχθεί από τον χρήστη).

Με αυτό μπορείτε να δείτε πώς να χρησιμοποιήσετε την κλήση συστήματος stat από τη γλώσσα προγραμματισμού C για να λάβετε πληροφορίες από τον πυρήνα του λειτουργικού συστήματος σχετικά με τα αρχεία. Εάν έχετε κάποια ερώτηση, μη διστάσετε να μας το πείτε μέσω της ενότητας σχολίων.