Chiamate di sistema

Stat System Call Linux Tutorial

Stat System Call Linux Tutorial

Chiamate di sistema Linux

Le chiamate di sistema fornite dal kernel Linux sono esposte nel linguaggio di programmazione C tramite glibc.  Quando viene utilizzata una chiamata di sistema, stai comunicando con il sistema operativo e al ritorno il sistema operativo comunica con te tramite 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, cancellato) ovvero timestamp, e il percorso del file, l'ID utente e l'ID gruppo, i collegamenti 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:

int stat(const char *percorso, struct stat *buf)

Il tipo di ritorno della funzione in int, se la funzione viene eseguita con successo, 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.

Allora nella funzione abbiamo a struttura statistica 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 in defined il file di intestazione contiene i seguenti campi:

stato della struttura

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          st_size;
struct timspec st_atim;
struct timspec st_mtim;
struct timspec 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 o i 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, dice 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
intero principale()

//puntatore alla struttura stat
struct stat sfile;
//stat system call system
stat("stat.c", &sfile);
//accesso a st_mode (membro dati della struttura stat)
printf("st_mode = %o", sfile.st_mode);
restituisce 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
void sfile(char const nomefile[]);
int main()
ssize_t letto;
carattere* buffer = 0;
size_t buf_size = 0;
printf("Inserisci il nome di un file da controllare: \n");
read = getline(&buffer, &buf_size, stdin);
se (leggi <=0 )
printf("getline fallito\n");
uscita(1);

if (buffer[read-1] == '\n')
buffer[leggi-1] = 0;

int s=open(buffer,O_RDONLY);
if(s==-1)
printf("Il file non esiste\n");
uscita(1);

altro
sfile(buffer);

libero (tampone);
restituisce 0;

void sfile(char const nomefile[])
struct stat sfile;
if(stat(nomefile,&sfile)==-1)
printf("Si è verificato un errore\n");

//Accesso ai membri dei dati di stat struct
printf("\nFile st_uid %d \n",sfile.st_uid);
printf("\nFile st_blksize %ld \n",sfile.st_blksize);
printf("\nFile st_gid %d \n",sfile.st_gid);
printf("\nFile st_blocks %ld \n",sfile.blocchi_st);
printf("\nFile st_size %ld \n",sfile.st_size);
printf("\nFile st_nlink %u \n",(unsigned int)sfile.st_nlink);
printf("\nPermessi File Utente\n");
printf((sfile.st_mode & S_IRUSR)? "r": "-");
printf((sfile.st_mode & S_IWUSR)? "w":"-");
printf((sfile.st_mode & S_IXUSR)? "X":"-");
printf("\n");
printf("\nGruppo permessi file\n");
printf((sfile.st_mode & S_IRGRP)? "r":"-");
printf((sfile.st_mode & S_IWGRP)? "w":"-");
printf((sfile.st_mode & S_IXGRP)? "X":"-");
printf("\n");
printf("\nPermessi file Altro\n");
printf((sfile.st_mode & S_IROTH)? "r": "-");
printf((sfile.st_mode & S_IWOTH)? "w":"-");
printf((sfile.st_mode & S_IXOTH)? "X":"-");
printf("\n");

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 quindi 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 vengono utilizzati 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, sentiti libero di comunicarcelo tramite la sezione commenti.

I migliori giochi da riga di comando per Linux
La riga di comando non è solo il tuo più grande alleato quando usi Linux, ma può anche essere una fonte di intrattenimento perché puoi usarla per gioc...
Le migliori app di mappatura del gamepad per Linux
Se ti piace giocare su Linux con un gamepad invece di un tipico sistema di input di tastiera e mouse, ci sono alcune app utili per te. Molti giochi pe...
Strumenti utili per i giocatori Linux
Se ti piace giocare su Linux, è probabile che tu abbia utilizzato app e utilità come Wine, Lutris e OBS Studio per migliorare l'esperienza di gioco. O...