GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué es `S_ISREG()` y qué hace?

S_ISREG() es una macro que se utiliza para interpretar los valores en una estructura estadística, tal como los devuelve la llamada al sistema stat(). Se evalúa como verdadero si el argumento (el miembro st_mode en struct stat) es un archivo normal.

Ver man stat , man fstat o man inode (enlace a la página de manual de inode) para obtener más detalles. Aquí está la parte relevante de la página 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 */
       }

El estándar POSIX que define S_ISREG está en línea.

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html

Cita:

Se proporcionarán las siguientes macros para probar si un archivo es del tipo especificado. El valor m suministrado a las macros es el valor de st_mode de una estadística estructura. La macro se evaluará a un valor distinto de cero si la prueba es verdadera; 0 si la prueba es falsa.

[...]

S_ISFIFO(m )

Prueba para una tubería o archivo especial FIFO.

S_ISREG(m )

Prueba para un archivo regular.

S_ISLNK(m )

Prueba de un enlace simbólico.

[...]

Una forma típica de usar S_ISREG es llamar primero al stat función para llenar un struct stat objeto con información sobre un archivo. Entonces el valor del st_mode miembro de esta estructura, un tipo entero, se puede probar con esta macro.

Además del estándar, hay páginas de manual de varios sistemas en línea, así como tutoriales sobre programación con stat. La Wikipedia tiene una página sobre estadísticas, con un ejemplo de código aparentemente completo. Aunque no cuenta con S_ISREG , que se puede trabajar fácilmente.


Prueba el st_mode miembro del stat estructura recuperada usando el stat() función para determinar si el archivo es un archivo regular (es decir, en un disco o almacenamiento masivo en lugar de decir un directorio, socket, enlace simbólico, por ejemplo.

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 ) ;
    }
}

El st_mode el miembro contiene 4 bits enmascarados por S_IFMT (0170000). Los valores de estos bits son:

       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

por lo que la macro S_ISREG podría definirse así:

#define S_ISREG( m ) (((m) & S_IFMT) == S_IFREG)

Dado que es una macro, puede ver su definición real en el archivo de encabezado sys/stat.h . En el encabezado GNU se define esto:

#define __S_ISTYPE(mode, mask)  (((mode) & __S_IFMT) == (mask))
...
#define S_ISREG(mode)    __S_ISTYPE((mode), __S_IFREG)

que es esencialmente lo mismo en mi versión simplificada.


Linux
  1. ¿Qué es un servidor web y cómo funciona un servidor web?

  2. Qué es NFS y cómo instalarlo en Linux

  3. ¿Qué hace “lc_all=c”?

  4. Que hace ?

  5. ¿Qué hace Exec 3?

¿Qué es un Makefile y cómo funciona?

Comando de archivo de Linux:qué hace y cómo usarlo

¿Qué indica esta estadística de proceso?

¿Qué es un archivo .sh?

¿Qué es un archivo .so?

¿Qué significa el 'rc' en '.bashrc', etc.?