GNU/Linux >> Znalost Linux >  >> Linux

Co je to `S_ISREG()` a co dělá?

S_ISREG() je makro používané k interpretaci hodnot ve struktuře stat, jak jsou vráceny ze systémového volání stat(). Vyhodnotí se jako true, pokud je argument (člen st_mode ve struct stat) běžný soubor.

Viz man stat , man fstat nebo man inode (odkaz na manuálovou stránku inode) pro další podrobnosti. Zde je relevantní část manuálové stránky:

   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 */
       }

Standard POSIX, který definuje S_ISREG, je ve skutečnosti online.

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

Citace:

Pro testování, zda je soubor specifikovaného typu, budou poskytnuta následující makra. Hodnota m dodaná do maker je hodnota st_mode ze statu struktura. Pokud je test pravdivý, makro se vyhodnotí na nenulovou hodnotu; 0, pokud je test nepravdivý.

[...]

S_ISFIFO(m )

Test na potrubí nebo speciální soubor FIFO.

S_ISREG(m )

Otestujte běžný soubor.

S_ISLNK(m )

Otestujte symbolický odkaz.

[...]

Typický způsob použití S_ISREG je nejprve zavolat stat funkce k vyplnění struct stat objekt s informacemi o souboru. Potom hodnota st_mode člen této struktury, celočíselný typ, lze testovat pomocí tohoto makra.

Kromě standardu jsou online manuálové stránky z různých systémů a také tutoriály o programování se statem. Wikipedie má stránku o statistikách se zjevně kompletním příkladem kódu. Ačkoli neobsahuje S_ISREG , které lze snadno zapracovat.


Testuje st_mode člen stat struktura načtená pomocí stat() funkce k určení, zda je soubor běžným souborem (tj. na disku nebo velkokapacitním úložišti, nikoli například adresář, soket, symbolický odkaz.

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

st_mode člen obsahuje 4 bity maskované S_IFMT (0170000). Hodnoty těchto bitů jsou:

       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

takže makro S_ISREG by mohlo být definováno takto:

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

Protože se jedná o makro, můžete se na jeho skutečnou definici podívat v hlavičkovém souboru sys/stat.h . V hlavičce GNU je to definováno takto:

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

což je v podstatě stejné v mé zjednodušené verzi.


Linux
  1. Co je Makefile a jak funguje?

  2. Co je webový server a jak webový server funguje?

  3. Co je NFS a jak jej nainstalovat na Linux

  1. Co dělá „lc_all=c“?

  2. Co dělá ?

  3. Co dělá Echo $? Dělat??

  1. Co je DNS a jak funguje?

  2. Jak rm funguje? Co dělá rm?

  3. Co přesně je <() v bash (a =() v zsh)?