GNU/Linux >> Tutoriels Linux >  >> Linux

Qu'est-ce que `S_ISREG()` et à quoi sert-il ?

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.


Linux
  1. Qu'est-ce qu'un Makefile et comment ça marche ?

  2. Comment ça marche ? Que fait rm ?

  3. Que signifie le « rc » dans « .bashrc », etc. ?

  4. Qu'est-ce que <() dans bash (et =() dans zsh) ?

  5. Que fait kill -- -0 ?

Commande de fichier Linux :que fait-elle et comment l'utiliser

Qu'est-ce que cette statistique de processus indique ?

Qu'est-ce qu'un fichier .pid et que contient-il ?

Qu'est-ce qu'un fichier .sh ?

Qu'est-ce qu'un fichier .so.2 ?

Qu'est-ce qu'un fichier .so ?