Saltar al contenido

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

Ya no tienes que buscar más en internet ya que estás al lugar indicado, contamos con la respuesta que necesitas hallar pero sin complicarte.

Solución:

S_ISREG() es un macro se utiliza para interpretar los valores en una estructura estadística, tal como los devuelve la llamada al sistema stat(). Se evalúa a true 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 */
       

Pone a prueba el st_mode miembro de 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 ) ;
    

los st_mode 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

entonces el macro S_ISREG podría definirse así:

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

Dado que es un macro puede ver su definición real en el archivo de encabezado sys/stat.h. En la cabecera 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.

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

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

Cotizar:

Se proporcionarán las siguientes macros para probar si un archivo es del tipo especificado. El valor metro suministrado a las macros es el valor de modo_st a partir de una estadística estructura. los macro evaluará a un valor distinto de cero si la prueba es true; 0 si la prueba es false.

[…]

S_ISFIFO(metro)

Prueba para una tubería o archivo especial FIFO.

S_ISREG(metro)

Prueba para un archivo regular.

S_ESLNK(metro)

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 de la st_mode miembro de esta estructura, un tipo entero, se puede probar con este 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 S_ISREGque se puede trabajar fácilmente.

Si tienes alguna duda y forma de mejorar nuestro noticia puedes añadir una acotación y con placer lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *