GNU/Linux >> Linux Esercitazione >  >> Linux

Cos'è `S_ISREG()` e cosa fa?

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.


Linux
  1. Cos'è NFS e come installarlo su Linux

  2. Cosa fa Eco $? Fare??

  3. Cos'è il DNS e come funziona?

  4. Cos'è un file .pid e cosa contiene?

  5. Cos'è un file .so.2?

Comando file Linux:cosa fa e come usarlo

Cosa indica questa statistica del processo?

Cos'è un file .sh?

Come funziona rm? Cosa fa rm?

Cos'è un file .so?

Cos'è esattamente <() in bash (e =() in zsh)?