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.