Аргумент mq_open oflag не отражает фактические биты доступа созданного файла mqueue - PullRequest
1 голос
/ 02 марта 2020

Я звоню mq_open на linux 5.5.6 примерно так:

mq_open("/testing12345", O_RDWR | O_CREAT | O_NONBLOCK, 0777, & (struct mq_attr) {0, 10, 255, 0));

Обратите внимание, что я передал 0777 в качестве третьего аргумента.

Функция завершается успешно и создается соответствующий mqueue, после чего я монтирую файловую систему mqueue из своей оболочки:

mount -t mqueue none ./mqueue_dir

Однако, при определении узла нового mqueue выдается 0755 как биты доступа:

stat -c %a ./mqueue_dir/testing12345

0755

Почему это так? Я ясно передал константу 0777 при вызове mq_open.


Воспроизводимый пример

, скомпилированный с gcc -Wall -Werror -lrt a.c -o ./a

#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <mqueue.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(void) {
    const mqd_t descriptor = mq_open("/testing12345", O_RDWR | O_CREAT | O_NONBLOCK, 0777, & (struct mq_attr) {0, 10, 255, 0});
    if(descriptor == -1) {
        perror("parent: failed opening mqueue");
        return EXIT_FAILURE;
    }

    sleep(30u);

    mq_unlink("/testing123");

    return EXIT_SUCCESS;
}

1 Ответ

2 голосов
/ 02 марта 2020

Ваша «маска создания файла» почти наверняка установлена ​​на 022, тем самым «маскируя» указанное вами «1004 *« вниз »на 0755.

Per документация POSIX umask() (выделение жирным шрифтом):

ИМЯ

umask - установить и получить маску создания режима файла

SYNOPSIS

#include <sys/stat.h>

mode_t umask(mode_t cmask);

ОПИСАНИЕ

Функция umask() устанавливает маску создания режима файла для процесса в cmask и вернуть предыдущее значение маски. Используются только биты прав доступа к файлу cmask (см. <sys/stat.h>); значение других битов определяется реализацией.

Маска создания режима файла процесса используется для отключения битов разрешения в аргументе mode, предоставляемом во время вызовов следующих функций:

  • open (), openat (), creat (), mkdir (), mkdirat (), mkfifo () и mkfifoat ()

  • mknod (), mknodat ()

  • mq_open ()

  • sem_open ()

битовые позиции установленные в cmask очищаются в режиме созданного файла.

См. также Когда полезен umask ()? .

По сути, для обеспечения того, чтобы создаваемый вами файл (ы) имел заданный режим c, вы должны либо очистить маску создания файла с помощью umask( 0 ), либо вы должны явно установить Точный режим вы хотите после вы создаете файл. Поскольку вызов umask() влияет на состояние всего процесса , почти всегда лучше явно установить режим напрямую.

...