2016-10-20 2 views
7

Я наткнулся на макрос S_ISREG() в программе на C, которая извлекает атрибуты файла. К сожалению, основной информации об этом макросе нет. Есть несколько более продвинутых обсуждений по этому вопросу, но это выходит за рамки того, что я ищу.Что такое S_ISREG() и что он делает?

Что такое S_ISREG() и что он делает? В контексте программы, которая извлекает атрибуты файлов, какую цель она выполняет и что именно она делает?

спасибо.

+1

В [документации] (https://www.gnu.org/software/libc/manual/html_node/Testing-File-Type.html) говорится «* Этот макрос возвращает ненулевое значение, если файл является обычным файлом. *« - сколько еще «базовых» вы можете получить; Я действительно задаюсь вопросом, что за «расширенной дискуссией» вы действительно можете иметь об этом? – Clifford

+0

@Clifford Спасибо. Единственные другие вопросы, касающиеся этого макроса, касались более продвинутых приложений. –

+0

@ryyker Нет, это не так. Если вы прочтете вопрос, который вы опубликовали, вы обнаружите, что он фокусируется на более продвинутых приложениях. –

ответ

12

S_ISREG() - это макрос, используемый для интерпретации значений в stat-struct, возвращаемых из системного вызова stat(). Он оценивает значение true, если аргумент (член st_mode в struct stat) является обычным файлом.

Просмотреть дополнительную информацию по man stat или man fstat. Вот соответствующая часть страницы человека:

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

Он проверяет st_mode член stat структуры извлеченной с помощью функции stat(), чтобы определить, является ли файл regualar файл (т.е. на на диске или массовой памяти, а не говорить .. каталог, сокет, символьная ссылка, например

struct stat sb; 
if(stat(file_path, &sb) 1= -1) 
{ 
    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) 

, который по сути является тем же самым в моей упрощенной версии.

+0

Ваш if-test инвертирован. Если S_ISREG() отличен от нуля, тогда рассматриваемый объект является обычным файлом. –

+0

@BjornA. : Исправлено - спасибо за место. – Clifford

4

Стандарт POSIX, который определяет S_ISREG, фактически находится в режиме онлайн.

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

Цитата:

Следующие макросы должны быть предоставлены, чтобы проверить, является ли файл указанного типа. Значение m, поданное на макросы, представляет собой значение st_mode от stat Структура. Макрос должен вычислять ненулевое значение, если тест истинен; 0, если тест ложный.

[...]

S_ISFIFO (м)

      Тест на трубу или специальный файл FIFO.

S_ISREG (м)

      Тест для обычного файла.

S_ISLNK (м)

      Тест для символической ссылки.

[...]

Типичный способ использования S_ISREG является первым вызвать функцию stat заполнить struct stat объект с информацией о файле. Затем с этим макросом может быть проверено значение члена st_mode этой структуры, целочисленного типа.

Кроме того, в стандарте есть справочные страницы из различных систем онлайн, а также учебные пособия по программированию со статусом. В Википедии есть page on stat с явно полным примером кода. Хотя он не содержит S_ISREG, который можно легко сработать.

Смежные вопросы