S_ISREG() è una macro utilizzata per interpretare i valori in una stat-struct, come restituiti dalla chiamata di sistema stat(). Restituisce true se l'argomento (il membro st_mode in struct stat) è un file normale.
Vedi man stat
, man fstat
o man inode
(collegamento alla pagina man di inode) per ulteriori dettagli. Ecco la parte rilevante della pagina man:
Because tests of the above form are common, additional macros are defined by POSIX to allow the test of the file type in st_mode to be written more concisely:
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
The preceding code snippet could thus be rewritten as:
stat(pathname, &sb);
if (S_ISREG(sb.st_mode)) {
/* Handle regular file */
}
Lo standard POSIX che definisce S_ISREG è infatti online.
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html
Citazione:
Le seguenti macro devono essere fornite per verificare se un file è del tipo specificato. Il valore m fornito alle macro è il valore di st_mode da una stat struttura. La macro deve valutare un valore diverso da zero se il test è vero; 0 se il test è falso.
[...]
S_ISFIFO(m )
Prova una pipe o un file speciale FIFO.
S_ISREG(m )
Prova per un file normale.
S_ISLNK(m )
Test per un collegamento simbolico.
[...]
Un modo tipico per usare S_ISREG è chiamare prima stat
funzione per riempire un struct stat
oggetto con informazioni su un file. Quindi il valore di st_mode
membro di questa struttura, un tipo intero, può essere testato con questa macro.
Oltre allo standard, ci sono pagine man di vari sistemi online, oltre a tutorial sulla programmazione con stat. La Wikipedia ha una pagina su stat, con un esempio di codice apparentemente completo. Anche se non presenta S_ISREG
, che può essere facilmente lavorato.
Testa il st_mode
membro dell'stat
struttura recuperata utilizzando il stat()
funzione per determinare se il file è un file normale (ovvero su disco o memoria di massa piuttosto che dire una directory, un socket, un collegamento simbolico per esempio.
struct stat sb;
if( stat( file_path, &sb) != -1) // Check the return value of stat
{
if( S_ISREG( sb.st_mode ) != 0 )
{
printf( "%s is a file", file_path ) ;
}
else
{
printf( "%s is not a file", file_path ) ;
}
}
Il st_mode
Il membro contiene 4 bit mascherati da S_IFMT
(0170000). I valori di questi bit sono:
S_IFSOCK 0140000 socket
S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file
S_IFBLK 0060000 block device
S_IFDIR 0040000 directory
S_IFCHR 0020000 character device
S_IFIFO 0010000 FIFO
quindi la macro S_ISREG potrebbe essere definita così:
#define S_ISREG( m ) (((m) & S_IFMT) == S_IFREG)
Poiché si tratta di una macro, puoi vedere la sua definizione effettiva nel file di intestazione sys/stat.h
. Nell'intestazione GNU è definito questo:
#define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask))
...
#define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG)
che è essenzialmente lo stesso nella mia versione semplificata.