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:
#includereStat 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
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:
- st_dev: È l'ID del dispositivo in cui risiediamo attualmente il nostro file.
- st_rdev: Questo campo descrive che un particolare file rappresenta un particolare dispositivo.
- 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
- st_size: st_size è la dimensione del file in byte.
- st_atime: È l'ultima volta o l'ora recente in cui è stato effettuato l'accesso al file.
- st_ctime: È l'ora recente in cui lo stato o i permessi del file sono stati modificati.
- st_mtime: È l'ora recente in cui il file è stato modificato.
- st_blksize: Questo campo fornisce la dimensione del blocco preferita per il file system I/O che può variare da file a file.
- blocchi_st: Questo campo indica il numero totale di blocchi in multipli di 512 byte.
- st_nlink: Questo campo indica il numero totale di hard link.
- st_uid: Questo campo indica l'ID utente.
- st_gid: Questo campo indica l'ID del gruppo.
- 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
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.