Что такое "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)

что по существу то же самое в моей упрощенной версии.