S_ISREG() は、システム コール stat() から返される stat-struct の値を解釈するために使用されるマクロです。引数 (struct stat の st_mode メンバー) が通常のファイルである場合、true と評価されます。
man stat
を参照 、 man fstat
または man inode
詳細については、i ノードのマニュアル ページへのリンクを参照してください。 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 */
}
S_ISREG を定義する POSIX 標準は、実際にはオンラインです。
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html
引用:
<ブロック引用>次のマクロは、ファイルが指定されたタイプであるかどうかをテストするために提供されます。値 m マクロに提供されるのは st_mode の値です 統計から 構造。テストが真の場合、マクロはゼロ以外の値に評価されます。テストが偽の場合は 0。
[...]
S_ISFIFO(分 )
パイプまたは FIFO 特殊ファイルをテストします。
S_ISREG(分 )
通常のファイルをテストします。
S_ISLNK(分 )
シンボリック リンクをテストします。
[...]
S_ISREG を使用する一般的な方法は、最初に stat
を呼び出すことです。 struct stat
を埋める関数 ファイルに関する情報を持つオブジェクト。次に、st_mode
の値 この構造体のメンバーである整数型は、このマクロでテストできます。
標準に加えて、オンラインのさまざまなシステムの man ページや、stat を使用したプログラミングに関するチュートリアルがあります。ウィキペディアには統計に関するページがあり、明らかに完全なコード例があります。 S_ISREG
はありませんが 、簡単に作業できます。
st_mode
をテストします stat
のメンバー stat()
を使用して取得された構造 ファイルが通常のファイル (つまり、ディレクトリ、ソケット、シンボリック リンクなどではなく、ディスク上または大容量ストレージ上) であるかどうかを判断する関数。
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
メンバーには、S_IFMT
でマスクされた 4 ビットが含まれます (0170000)。これらのビットの値は次のとおりです:
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
したがって、マクロ S_ISREG は次のように定義される可能性があります:
#define S_ISREG( m ) (((m) & S_IFMT) == S_IFREG)
これはマクロなので、ヘッダー ファイル sys/stat.h
で実際の定義を確認できます。 . GNU ヘッダーでは、次のように定義されています:
#define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask))
...
#define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG)
これは、私の簡略化されたバージョンでも本質的に同じです。