S_ISREG() ist ein Makro, das verwendet wird, um die Werte in einer stat-Struktur zu interpretieren, wie sie vom Systemaufruf stat() zurückgegeben werden. Es wird als wahr ausgewertet, wenn das Argument (das st_mode-Member in struct stat) eine reguläre Datei ist.
Siehe man stat
, man fstat
oder man inode
(Link zur Manpage von Inode) für weitere Details. Hier ist der relevante Teil der Manpage:
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 */
}
Der POSIX-Standard, der S_ISREG definiert, ist tatsächlich online.
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html
Zitat:
Die folgenden Makros sollen bereitgestellt werden, um zu testen, ob eine Datei vom angegebenen Typ ist. Der Wert m an die Makros geliefert wird, ist der Wert von st_mode aus einer Statistik Struktur. Das Makro soll einen Wert ungleich Null ergeben, wenn der Test wahr ist; 0, wenn der Test falsch ist.
[...]
S_ISFIFO(m )
Test auf eine spezielle Pipe- oder FIFO-Datei.
S_ISREG(m )
Testen Sie auf eine normale Datei.
S_ISLNK(m )
Testen Sie auf einen symbolischen Link.
[...]
Eine typische Art, S_ISREG zu verwenden, besteht darin, zuerst stat
aufzurufen Funktion zum Füllen eines struct stat
Objekt mit Informationen über eine Datei. Dann der Wert von st_mode
Member dieser Struktur, ein Integer-Typ, kann mit diesem Makro getestet werden.
Neben dem Standard gibt es Manpages von verschiedenen Systemen online, sowie Tutorials zur Programmierung mit stat. Die Wikipedia hat eine Statistikseite mit einem scheinbar vollständigen Codebeispiel. Obwohl es S_ISREG
nicht enthält , die leicht eingearbeitet werden können.
Es testet den st_mode
Mitglied der stat
Struktur, die mit stat()
abgerufen wird Funktion, um festzustellen, ob es sich bei der Datei um eine normale Datei handelt (d. h. auf der Festplatte oder auf einem Massenspeicher und nicht etwa um ein Verzeichnis, einen Socket oder einen symbolischen Link).
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 ) ;
}
}
Die st_mode
Mitglied enthält 4 Bits, die durch S_IFMT
maskiert sind (0170000). Die Werte dieser Bits sind:
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
das Makro S_ISREG könnte also folgendermaßen definiert werden:
#define S_ISREG( m ) (((m) & S_IFMT) == S_IFREG)
Da es sich um ein Makro handelt, können Sie seine tatsächliche Definition in der Header-Datei sys/stat.h
einsehen . Im GNU-Header ist es so definiert:
#define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask))
...
#define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG)
was bei meiner vereinfachten Version im Wesentlichen dasselbe ist.