GNU/Linux >> Linux の 問題 >  >> Linux

`S_ISREG()` とは何ですか?

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)

これは、私の簡略化されたバージョンでも本質的に同じです。


Linux
  1. Makefileとは何ですか?どのように機能しますか?

  2. NFSとは何ですか?Linuxにインストールする方法

  3. 「lc_all=c」は何をしますか?

  1. 何をしますか?

  2. Exec 3とは何ですか?

  3. .so.2 ファイルとは何ですか?

  1. .so ファイルとは何ですか?

  2. `.bashrc` などの 'rc' は何を意味していますか?

  3. <() の bash (および =() の zsh) とは正確には何ですか?