Что такое "S ISREG ()" и что он делает?
я наткнулся на макрос S_ISREG()
в программе C, которая извлекает атрибуты файла. К сожалению, нет никакой основной информации об этом макро онлайн. Есть более продвинутые обсуждения, но они выходят за рамки того, что я ищу.
что это S_ISREG()
, и что он делает? В контексте программы, которая извлекает атрибуты файлов, какой цели она служит и что именно она делает?
спасибо.
3 ответов
S_ISREG ()-макрос, используемый для интерпретации значений в структуре stat, возвращаемых из системного вызова stat (). Он принимает значение true, если аргумент (элемент st_mode в struct stat) является обычным файлом.
см. Man stat или man fstat для получения дополнительной информации. Вот соответствующая часть 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 */
}
стандарт POSIX определяет S_ISREG на самом деле онлайн.
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html
цитата:
следующие макросы должны быть предоставлены для проверки, является ли файл указанного типа. Значение m в макросы входит значение st_mode С stat структура. Макрос должен иметь ненулевое значение если тест истинен; 0 если тест ложен.
[...]
S_ISFIFO(m)
тест для трубы или специального файла FIFO.
S_ISREG(m)
это тесты st_mode
член stat
структура, полученная с помощью stat()
функция, чтобы определить, является ли файл regualar файл (т. е. на диске или массовом хранилище, а не сказать каталог, сокет, символическая ссылка, например.
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
элемент содержит 4 бита маскируются S_IFMT
(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 mighte быть определена таким образом:
#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)
что по существу то же самое в моей упрощенной версии.