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