Stat System Call Linux Tutorial

Stat System Call Linux Tutorial



Le chiamate di sistema fornite dal kernel Linux sono esposte nel linguaggio di programmazione C tramite glibc. Quando viene utilizzata una chiamata di sistema, si comunica con il sistema operativo e al ritorno il sistema operativo comunica con i parametri che vengono restituiti alle funzioni di chiamata di sistema (valori di ritorno).

Chiamata di sistema delle statistiche:

La chiamata di sistema Stat è una chiamata di sistema in Linux per controllare lo stato di un file, ad esempio per controllare quando è stato effettuato l'accesso al file. La chiamata di sistema stat() restituisce effettivamente gli attributi del file. Gli attributi del file di un inode sono fondamentalmente restituiti dalla funzione Stat(). Un inode contiene i metadati del file. Un inode contiene: il tipo del file, la dimensione del file, quando è stato effettuato l'accesso al file (modificato, eliminato) ovvero i timestamp, e il percorso del file, l'ID utente e l'ID gruppo, i collegamenti del file e indirizzo fisico del contenuto del file.







Possiamo dire che l'inode contiene tutti i dati necessari per la chiamata di sistema stat() ed è il numero di indice per il file che viene salvato nella tabella degli inode. Ogni volta che crei un file viene creato un numero di inode per quel file. Utilizzando la chiamata di sistema stat è possibile visualizzare le tabelle di sistema.



Sintassi della chiamata di sistema C Stat:

Per utilizzare la chiamata di sistema stat nel linguaggio di programmazione C, devi includere il seguente file di intestazione:



#includere

Stat viene utilizzato per ottenere lo stato di un file. La sintassi della chiamata di sistema C stat potrebbe non essere la stessa per tutti i sistemi operativi. In Linux la sintassi per la chiamata di sistema stat è la seguente:





intstato(cost char *il percorso, strutturastato*buffa)

Il tipo restituito della funzione in int, se la funzione viene eseguita correttamente, viene restituito 0 se ci sono errori, verrà restituito -1.

Qui const char *percorso specifica il nome del file. Se il percorso del file è un collegamento simbolico, è necessario specificare il collegamento anziché il nome del file.



Quindi nella funzione abbiamo una struttura stat in cui sono memorizzati i dati o le informazioni sul file che utilizza un puntatore denominato buffa, che viene passato come parametro e compilato durante l'esecuzione della chiamata e leggibile dall'utente dopo la chiamata.

Struttura delle statistiche:

La struttura stat definita nel file di intestazione contiene i seguenti campi:

strutturastato
{
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;
strutturatimspec st_atim;
strutturatimspec st_mtim;
strutturatimspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};

Descrizione:

  1. st_dev: È l'ID del dispositivo in cui risiediamo attualmente il nostro file.
  2. st_rdev: Questo campo descrive che un particolare file rappresenta un particolare dispositivo.
  3. st_ino: È il numero di inode o il numero di serie del file. Poiché è un numero di indice, dovrebbe essere univoco per tutti i file
  4. st_size: st_size è la dimensione del file in byte.
  5. st_atime: È l'ultima volta o l'ora recente in cui è stato effettuato l'accesso al file.
  6. st_ctime: È l'ora recente in cui lo stato oi permessi del file sono stati modificati.
  7. st_mtime: È l'ora recente in cui il file è stato modificato.
  8. st_blksize: Questo campo fornisce la dimensione del blocco preferita per il file system I/O che può variare da file a file.
  9. blocchi_st: Questo campo indica il numero totale di blocchi in multipli di 512 byte.
  10. st_nlink: Questo campo indica il numero totale di hard link.
  11. st_uid: Questo campo indica l'ID utente.
  12. st_gid: Questo campo indica l'ID del gruppo.
  13. st_mode: Indica i permessi sul file, indica le modalità su un file. Di seguito sono riportati i flag che dovrebbero essere definiti per il campo st_mode:
bandiere Descrizione Valore contrassegno
S_IFMT Una maschera di bit utilizzata per ottenere il valore della modalità di un file 0170000
S_IFSOCK Una costante di file di socket 0140000
S_IFLINK Una costante di file di collegamento simbolico 0120000
S_IFREG Costante di file per file normale 0100000
S_IFBLK Costante di file per file di blocco 0060000
S_IFDIR Costante di file per file di directory 0040000
S_IFCHR Costante di file per file di caratteri 0020000
S_IFIFO Una costante di file di fifo 0010000
S_ISUID Imposta bit ID utente 0004000
S_ISGID Imposta bit ID gruppo 0002000
S_ISVTX Bit appiccicoso che indica il testo condiviso 0001000
S_IRWXU Permessi del proprietario (lettura, scrittura, esecuzione) 00700
S_IRUSR Permessi di lettura per il proprietario 00400
S_IWUSR Permessi di scrittura per il proprietario 00200
S_IXUSR Esegui permessi per il proprietario 00100
S_IRWXG Permessi di gruppo (lettura, scrittura, esecuzione) 00070
S_IRGRP Permessi di lettura per il gruppo 00040
S_IWGRP Permessi di scrittura per il gruppo 00020
S_IXGRP Autorizzazioni di esecuzione per il gruppo 00010
S_IRWXO Permessi per gli altri (lettura, scrittura, esecuzione) 00007
S_IROTH Permessi di lettura per gli altri 00004
S_IWOTH Permessi di scrittura per gli altri 00002
S_IXOTH Esegui permessi per gli altri 00001

Come usare la chiamata di sistema Stat:

L'esempio seguente mostra come utilizzare la chiamata di sistema stat nel linguaggio di programmazione C in Linux, Ubuntu.

ESEMPIO 1:

Nel codice seguente troveremo la modalità di un file:

CODICE:

#includere
#includere
intprincipale()
{
//puntatore alla struttura stat
strutturascheda di stato;

//stat system call
stato('stat.c', &sfile);

//accesso a st_mode (membro dati della struttura stat)
printf ('st_mode = %o',file.st_mode);
Restituzione 0;
}

La compilazione e l'esecuzione del programma restituisce come di seguito:

In questo codice, abbiamo passato il nome del file nella chiamata di sistema stat e quindi il puntatore alla struttura stat che è sfile. Il puntatore a stat struct viene quindi utilizzato per accedere a st_mode che visualizza la modalità del file utilizzando l'istruzione printf.

Il file di intestazione viene utilizzato in modo da poter utilizzare la chiamata di sistema stat. Il file di intestazione è il file della libreria standard di input/output in modo che tu possa usare printf o scanf nel tuo codice C.

ESEMPIO 2:

Nel codice seguente otterremo informazioni sul file utilizzando la chiamata di sistema stat:

CODICE:

#includere
#includere
#includere
#includere

vuotosfile(char costnome del file[]);

intprincipale(){
ssize_t leggi;
char*respingente= 0;
taglia_tbuf_size= 0;

printf ('Inserisci il nome di un file da controllare: ');
leggere=getline(&respingente, &buf_size,standard);

Se (leggere<=0 ){
printf ('Getline fallito' ');
Uscita (1);
}

Se (respingente[leggere-1] == ' '){
respingente[leggere-1] = 0;
}

intS=aprire(respingente,O_RDONLY);
Se(S== -1){
printf ('Il file non esiste ');
Uscita (1);
}
altro{
sfile(respingente);
}
gratuito (respingente);
Restituzione 0;
}

vuotosfile(char costnome del file[]){

strutturascheda di stato;

Se(stato(nome del file, &sfile)== -1){
printf ('Errore ');
}

//Accesso ai membri dei dati di stat struct
printf (' File st_uid %d ',file.st_uid);
printf (' File st_blksize %ld ',file.st_blksize);
printf (' File st_gid %d ',file.st_gid);
printf (' File st_blocks %ld ',file.st_blocks);
printf (' File st_size %ld ',file.st_size);
printf (' File st_nlink% u ',(non firmato int)file.st_nlink);
printf (' Autorizzazioni file Utente ');
printf ((file.st_mode &S_IRUSR)? 'R':'-');
printf ((file.st_mode &S_IWUSR)? 'in':'-');
printf ((file.st_mode &S_IXUSR)? 'X':'-');
printf (' ');
printf (' Gruppo autorizzazioni file ');
printf ((file.st_mode &S_IRGRP)? 'R':'-');
printf ((file.st_mode &S_IWGRP)? 'in':'-');
printf ((file.st_mode &S_IXGRP)? 'X':'-');
printf (' ');
printf (' Autorizzazioni file Altro ');
printf ((file.st_mode &S_IROTH)? 'R':'-');
printf ((file.st_mode &S_IWOTH)? 'in':'-');
printf ((file.st_mode &S_IXOTH)? 'X':'-');
printf (' ');
}

PRODUZIONE:

Nel codice C sopra, abbiamo inserito il nome del file e se il file non esiste, l'esecuzione del programma verrà interrotta. Ciò è dimostrato nell'immagine seguente:

Se il nostro file esiste, verrà chiamata la funzione sfile(n) in cui abbiamo passato il nome del file. All'interno della funzione, prima di tutto abbiamo usato la chiamata di sistema Stat, se stat() restituisce -1 allora deve esserci un errore così verrà stampato un messaggio e l'esecuzione del programma verrà interrotta.

Quindi nell'istruzione printf abbiamo usato il nome della funzione e il separatore di punti per accedere ai membri dei dati di struttura statistica .

Quindi per la modalità del file abbiamo avuto accesso alle macro o ai flag di st_mode. Qui logico e operatore viene utilizzato per stampare le rispettive modalità. Abbiamo verificato le autorizzazioni per utente, gruppo e altri per il file specificato (nome file inserito dall'utente).

Con questo puoi vedere come usare la chiamata di sistema stat dal linguaggio di programmazione C per ottenere informazioni dal kernel del sistema operativo sui file. Se hai una domanda, non esitare a comunicarcelo tramite la sezione commenti.