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.