Как читать биты прав доступа к файлам, используя только системные вызовы open и read?

Я могу проверить биты прав доступа к файлу с помощью системного вызова stat(), который возвращает структуру, содержащую поле, которое, в свою очередь, содержит тип и режим файла. Есть ли способ сделать то же самое, используя только системные вызовы open и read? т.е. анализируя каждый бит? Например, следующий код читает файл (первые четыре байта) и определяет, является ли он файлом ELF или нет.

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fd = open("main", O_RDONLY);

    char *buf = malloc(sizeof (char) * 4);

    read (fd, buf, 4);

    if (strcmp(buf, "ELF"))
        printf("It is an ELF file.\n");
    free(buf);

    return 0;
}

Есть ли аналогичный способ чтения файла для побитового извлечения информации?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
212
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Права доступа к файлу являются не частью содержимого файла, а частью его записи в каталоге, поэтому вы не можете прочитать разрешения, используя open или read для файла.

Использование stat — правильный способ сделать это.

Я хочу проверить биты напрямую, т.е. если разрешения являются частью записи Dir, то нет ли способа прочитать это напрямую? Любые полезные ресурсы будут полезны, я не смог их найти.

ankush 23.12.2020 16:16

@debdut Возможно, вы сможете это сделать, если попытаетесь прочитать каталог как файл, но вы получите те же значения, что и из stat, и процесс будет зависеть от файловой системы. Почему вы хотите сделать это таким образом?

dbush 23.12.2020 16:18

Такой осмотр помогает мне понять концепцию. Это только для целей обучения.

ankush 23.12.2020 16:20

Я видел, что вы упомянули в другом комментарии, что делаете это только в учебных целях. Кто-нибудь еще читает это для производственной работы... НЕ ДЕЛАЙТЕ. Это будет непереносимо! Вы, вероятно, просто хотите использовать stat в содержащем каталоге.

Вы захотите взглянуть на определение вашей системы функции stat. Вот один из примеров реализации функции статистики. Это определенно не так просто, как просто вызвать stat. Но если вы изучите этот источник и пройдёте по ссылкам в нём, вы поймёте, как это работает.

К сожалению, я достаточно здравомыслящий, чтобы не изучать источник, и я не уверен, можно ли это сделать, используя только комбинации open и read. Я думаю, что нет, хотя (просто предположение)

Другие вопросы по теме