GNU/Linux >> Belajar Linux >  >> Linux

Apa itu `S_ISREG()`, dan apa fungsinya?

S_ISREG() adalah makro yang digunakan untuk menginterpretasikan nilai dalam stat-struct, seperti yang dikembalikan dari system call stat(). Dinilai benar jika argumen (Anggota st_mode di struct stat) adalah file biasa.

Lihat man stat , man fstat atau man inode (tautan ke halaman manual inode) untuk detail lebih lanjut. Inilah bagian yang relevan dari halaman manual:

   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 */
       }

Standar POSIX yang mendefinisikan S_ISREG sebenarnya online.

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html

Kutipan:

Makro berikut harus disediakan untuk menguji apakah file dari tipe yang ditentukan. Nilai m yang diberikan ke makro adalah nilai st_mode dari status struktur. Makro harus mengevaluasi ke nilai bukan nol jika pengujiannya benar; 0 jika tes salah.

[...]

S_ISFIFO(m )

Uji pipa atau file khusus FIFO.

S_ISREG(m )

Tes untuk file biasa.

S_ISLNK(m )

Uji tautan simbolis.

[...]

Cara umum untuk menggunakan S_ISREG adalah dengan memanggil stat terlebih dahulu berfungsi untuk mengisi struct stat objek dengan informasi tentang file. Kemudian nilai st_mode anggota struktur ini, tipe bilangan bulat, dapat diuji dengan makro ini.

Selain standar, terdapat halaman manual dari berbagai sistem online, serta tutorial tentang pemrograman dengan stat. Wikipedia memiliki halaman di stat, dengan contoh kode yang tampaknya lengkap. Meskipun tidak menampilkan S_ISREG , yang dapat dengan mudah dikerjakan.


Ini menguji st_mode anggota stat struktur diambil menggunakan stat() berfungsi untuk menentukan apakah file tersebut adalah file biasa (yaitu pada disk atau penyimpanan massal daripada mengatakan direktori, soket, tautan simbolik misalnya.

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 member berisi 4 bit yang ditutupi oleh S_IFMT (0170000). Nilai bit ini adalah:

       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

jadi makro S_ISREG mungkin didefinisikan sebagai berikut:

#define S_ISREG( m ) (((m) & S_IFMT) == S_IFREG)

Karena ini adalah makro, Anda dapat melihat definisi sebenarnya di file header sys/stat.h . Di header GNU didefinisikan sebagai berikut:

#define __S_ISTYPE(mode, mask)  (((mode) & __S_IFMT) == (mask))
...
#define S_ISREG(mode)    __S_ISTYPE((mode), __S_IFREG)

yang pada dasarnya sama dengan versi sederhana saya.


Linux
  1. Apa itu NFS dan bagaimana cara menginstalnya di Linux

  2. Apa?

  3. Apa itu Exec 3?

  1. Inti dari Uniq -u Dan Apa Fungsinya??

  2. Apa itu DNS dan Bagaimana Cara Kerjanya?

  3. Apa itu file .so.2?

  1. Apa itu Makefile dan bagaimana cara kerjanya?

  2. Apa itu Server Web, dan Bagaimana Cara Kerja Server Web?

  3. Apa yang dilakukan kill -- -0?