S_ISREG() est une macro utilisée pour interpréter les valeurs d'une structure stat, telles que renvoyées par l'appel système stat(). Il est évalué à true si l'argument (le membre st_mode dans struct stat) est un fichier normal.
Voir man stat
, man fstat
ou man inode
(lien vers la page de manuel inode) pour plus de détails. Voici la partie pertinente de la page de manuel :
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 */
}
Le standard POSIX qui définit S_ISREG est en fait en ligne.
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html
Citation :
Les macros suivantes doivent être fournies pour tester si un fichier est du type spécifié. La valeur m fournie aux macros est la valeur de st_mode d'une stat structure. La macro doit donner une valeur non nulle si le test est vrai ; 0 si le test est faux.
[...]
S_ISFIFO(m )
Teste un tube ou un fichier spécial FIFO.
S_ISREG(m )
Testez pour un fichier normal.
S_ISLNK(m )
Tester un lien symbolique.
[...]
Une façon typique d'utiliser S_ISREG est d'appeler d'abord le stat
fonction pour remplir un struct stat
objet avec des informations sur un fichier. Puis la valeur du st_mode
membre de cette structure, un type entier, peut être testé avec cette macro.
En plus de la norme, il existe des pages de manuel de divers systèmes en ligne, ainsi que des didacticiels sur la programmation avec stat. Wikipédia a une page sur les statistiques, avec un exemple de code apparemment complet. Bien qu'il ne comporte pas S_ISREG
, qui peut facilement être travaillé.
Il teste le st_mode
membre des stat
structure récupérée à l'aide du stat()
fonction pour déterminer si le fichier est un fichier normal (c'est-à-dire sur un disque ou un stockage de masse plutôt que de dire un répertoire, une socket, un lien symbolique par exemple.
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 ) ;
}
}
Le st_mode
le membre contient 4 bits masqués par S_IFMT
(0170000). Les valeurs de ces bits sont :
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
donc la macro S_ISREG pourrait être définie ainsi :
#define S_ISREG( m ) (((m) & S_IFMT) == S_IFREG)
Puisqu'il s'agit d'une macro, vous pouvez consulter sa définition réelle dans le fichier d'en-tête sys/stat.h
. Dans l'en-tête GNU, il est défini ceci :
#define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask))
...
#define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG)
qui est essentiellement le même dans ma version simplifiée.