GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist `S_ISREG()` und was macht es?

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.


Linux
  1. Was ist ein Webserver und wie funktioniert ein Webserver?

  2. Was bedeutet Echo $? Tun??

  3. Was ist eine .pid-Datei und was enthält sie?

  4. Wie funktioniert Rm? Was macht Rm?

  5. Was bedeutet das 'rc' in `.bashrc` usw.?

Was ist ein Makefile und wie funktioniert es?

Linux-Dateibefehl:Was macht er und wie wird er verwendet?

Was macht „lc_all=c“?

Was zeigt diese Prozessstatistik an?

Was ist eine .sh-Datei?

Was macht kill -- -0?