Кажется, вы задаете два совершенно разных вопроса: один о mmap()
и один о строковых литералах. Принимая последнее:
, чтобы изменить строковый литерал, который по умолчанию доступен только для чтения, мне нужно либо иметь хранилище массива (char arr [] = "sometext_to_change_in_l oop"), либо сделать другое Указатель, mallo c требуется пробел, а затем скопируйте первый адрес строки, которая указатель из mallo c. Но как изменить строку «в строке», не выполняя ни одного из этих действий?
Повторяю мои комментарии по вопросу, не существует определенного способа изменить строковый литерал. Любая попытка сделать это приведет к неопределенному поведению. Однако многие строки не являются литералами, и если они имеют элементы изменяемого типа и хранятся в доступном для записи хранилище, они могут быть изменены с помощью различных функций строк и ввода-вывода, а также путем обычного доступа к массивам, в которых они находятся. В частности, содержимое строкового литерала можно скопировать в такое пространство, а затем изменить полученную отдельную строку.
Что касается вопроса (ов) mmap()
, то общий вопрос кажется быть, как сопоставить файл, чтобы его содержимое можно было изменить с помощью сопоставления. Это уже рассмотрено в вашем другом ответе, в котором отмечается, что разрешенный доступ к отображению контролируется битовой маской, переданной как третий аргумент mmap()
, как описано в POSIX . Существуют отдельные биты для чтения, записи и выполнения доступа к содержимому сопоставления.
Вы go просите разъяснений:
1) - Да не изменить int flags
в вызове open
, так почему это работает, когда open
редактируется с O_RDONLY
, а не с O_RDWD
[sic], что делает тот же файл доступным для записи
Я понимаю, почему это наблюдение может стать неожиданностью. Отображение, установленное mmap()
, не обращается к базовому объекту через предоставленный файловый дескриптор , поэтому режим дескриптора не имеет значения. Дескриптор файла служит только (частичной) идентификацией данных, которые необходимо сопоставить. Разрешения для доступа через сопоставление определяются аргументами только для mmap()
, и вызов mmap()
завершится ошибкой, если процесс не имеет достаточных привилегий для сопоставленного объекта для доступа к нему в запрошенных режимах.
Как на самом деле могут быть сохранены изменения, если в mmap
у меня есть аргумент int flags
MAP_PRIVATE
, но я хочу сохранить изменения, поэтому у меня должно быть MAP_SHARED
?
Вы объединяете две разные вещи. Уже обсужденные режимы доступа определяют, можете ли вы писать в отображение. MAP_PRIVATE
против . MAP_SHARED
определяет, могут ли другие процессы видеть такие записи, либо в их собственной копии сопоставления, либо в базовом файле. POSIX выражает это как расположение записей в отображение. С помощью MAP_SHARED
они изменяют базовый объект. В MAP_PRIVATE
они не изменяют базовый объект и видны только процессу, выполнившему запись.
Не совсем понятно, о чем вы спрашиваете во втором редактировании, но я думаю, что это о записи в базовый объект через дескриптор файла и попытках наблюдать изменения через сопоставление. Естественно, дескриптор файла должен быть открыт в режиме, разрешающем запись, если вы хотите использовать его для записи в файл. Кроме того, однако, чтобы увидеть изменения через уже установленное отображение памяти, это отображение должно быть настроено как совместно используемое.
Как сказано в POSIX: «Не указано, были ли модификации базового объекта выполнены после Отображение MAP_PRIVATE установлено, видны через отображение MAP_PRIVATE ". Это в значительной степени оборотная сторона уже обсуждаемой семантики MAP_PRIVATE
: не только записи в сопоставление не отражаются в базовом объекте, но и модификации базового объекта также могут быть не видны через сопоставление. Напомним, что отображение, установленное mmap()
, не обращается к базовому объекту через предоставленный файловый дескриптор.