Как заставить `local` перехватывать код выхода?

Вы, кажется, путаете отображение памяти с файлами в файловых системах , находящихся в памяти, а также с другими концепциями, например, как процессы поддерживают доступ к { {1}} файлов, даже когда они перемещаются.

Я отвечу вопрос за вопросом, чтобы посмотреть, смогу ли я прояснить ситуацию.

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

Он действительно указывает на основную память, если она находится в файловой системе, находящейся в памяти, например, procfs , который обычно монтируется в / proc, или sysfs, который находится в / sys, или tmpfs, который иногда находится в / tmp.

  1. Если это возможно, то мы называем это «файлом с отображением в память»?

Нет. Как сказал Стивен-Китт, «отображение памяти» относится к способу доступа к файлу путем «сопоставления» его с основной памятью и работы с ним там, а не чтения и записи фрагментов в time с помощью таких функций, как read () и write ().

  1. Что означало бы перемещать такой файл по файловой системе (то есть , переносить такой файл из каталога в другой)? Насколько я понимаю, поскольку файл отображается в памяти, процесс (ы), взаимодействующий с файлом , всегда записывает в заранее определенную область основной памяти, а когда мы открываем {{1} } этот файл (например, используя vim), мы читаем эту область основной памяти (так что диск не задействован). Следовательно, независимо от того, куда мы перемещаем файл, он всегда будет работать правильно, верно? Если да, имеет ли какое-либо значение перемещение файла по файловой системе ?

Если вы перемещаете его в пределах той же файловой системы, вы на самом деле просто перемещаете по ссылке, inode из одного каталога в другой. Если есть программы , которые уже открыли этот файл, они все равно будут обращаться к тому же файлу , потому что у них уже есть индексный дескриптор под рукой через дескриптор файла. Это то, что произошло с файлом table_name.idb, который вы упомянули в комментарии.

  1. Есть ли команда, которая сообщала бы, отображен ли файл в память?

Wossname уже ответил на этот вопрос для файлов, отображенных в память. lsof сообщит вам , какие процессы отображают файл в память.

Чтобы узнать, находится ли файл в файловой системе, находящейся в памяти, вы можете использовать df или mount , чтобы перечислить файловые системы и их точки монтирования. Вам просто нужно знать , какие типы файловых систем находятся в памяти, просмотрев их (например, в википедии).

  1. Наконец, если я открою файл с отображением памяти с помощью vim, внесу в него некоторые изменения , сохраню и закрою vim, что произойдет? Будут ли мои изменения просто записаны в основную память? Если это так, увидят ли другие процессы, использующие этот файл , только что сделанные мной изменения? По моему опыту, другие процессы не видели изменений, которые я внес в файл, когда я внес некоторые изменения в файл с помощью vim. В чем причина этого?

Лично я не использовал функцию mmap в программе на языке C, но, как я понял это из просмотра man mmap ] и info mmap , нет никакого волшебства , задействованного в поддержании синхронизации представления в памяти. В своей базовой форме вызов mmap копирует содержимое файла в память, а msync используется для записи его обратно из памяти на диск. Если файл на диске изменяется, в нет ничего, что могло бы обнаружить это и автоматически изменить представление в памяти во всех процессах, которые его отображали.

РЕДАКТИРОВАТЬ: Оказывается, mmap () действительно пытается синхронизировать представление в памяти при некоторых условиях. Если карта только читается, она будет синхронизироваться, даже когда другие процессы записывают в файл. Если он записывается (путем присвоения области памяти), то, что происходит, зависит от того, какой из явно обязательных флагов MAP_SHARED или MAP_PRIVATE предоставлен mmap (). Если MAP_PRIVATE предоставлен, карта разветвляется из представления на диске и перестает синхронизироваться, пока вы не используете msync ().Если предоставляется MAP_SHARED, то обновления становятся видимыми для других процессов, которым сопоставлен файл, а также (хотя это не обязательно сразу) представление на диске.

Я только что открыл vim в существующем файле e и выполнил команду : w , в то время как имел inotifywait -m. работает в другом терминале. Среди некоторых странностей, это важная часть, которую я получил от inotifywait .

./ MOVED_FROM e
./ MOVED_TO e~
./ CREATE e
./ OPEN e
./ MODIFY e
./ CLOSE_WRITE,CLOSE e
./ ATTRIB e
./ ATTRIB e
./ DELETE e~

Vim создает новый файл и удаляет старый.Почему он делает это вместо изменения файла, выходит за рамки этого вопроса, но дело в том, что это новый файл и, следовательно, имеет новый индексный дескриптор.

Итак, что вы подразумеваете под другими процессами, использующими этот файл? Если вы имеете в виду процессы , у которых файл был открыт, пока вы это делали, нет, они не увидят изменений . Это потому, что, хотя они открыли файл с одним и тем же путем, они не являются одним и тем же файлом. Если вы имеете в виду процессы, которые могут открывать файл после того, как вы это сделали, то да, они увидят изменения. Они откроют новый файл , который вы создали.

Важно отметить, что, хотя может показаться, что программы открывают файл в пользовательском интерфейсе , это не обязательно означает, что они оставляют файл открытым в процессе. Vim является примером этого, как показано выше.

11
08.05.2016, 22:33
0 ответов

Теги

Похожие вопросы