- Re: Удаление открытых на запись файлов.
- Re: Удаление открытых на запись файлов.
- Re: Удаление открытых на запись файлов.
- Re: Удаление открытых на запись файлов.
- Re: Удаление открытых на запись файлов.
- 5.1.5.1. Удаление открытых файлов
- Читайте также
- 4.4.2.2. Закрытие всех открытых файлов
- 11.4.4. Удаление файлов
- Удаление файлов занятий
- 12.2 Копирование, перемещение и удаление файлов
- Удаление файлов и папок
- Удаление файлов
- Закрытие открытых файлов
- Копирование, изменение и удаление файлов
- 20.3.3. Удаление файлов в Unix необратимо
- 20.3.3. Удаление файлов в Unix необратимо
- 12.5. Удаление файлов и каталогов
- Пример 28-1. Удаление cookie-файлов
- 4.2.4. Удаление файлов и папок. Корзина
- Удаление файлов и папок
- Удаление файлов
- (Как) работает удаление открытых файлов в Linux и файловая система FAT?
- 1 ответ 1
Re: Удаление открытых на запись файлов.
А почему должно быть нельзя удалять файлы, открытые на запись?
Re: Удаление открытых на запись файлов.
Положим есть база данных в данный момент в таблицах изменяются значения т.есть происходит запись и это нормально что в этот момент можно просто взять и прибить файл куда пишется? а программа случайно не сойдет с ума? она же не сможет продолжить запись и наверняка завершится с ошибкой..
Re: Удаление открытых на запись файлов.
для предотвращения этого придумали права доступа и моск
Re: Удаление открытых на запись файлов.
Когда пользователь удаляет «файл», удаляется только связь данного имени с inode, но сам файл с жесткого диска не удаляется.
Re: Удаление открытых на запись файлов.
>Положим есть база данных в данный момент в таблицах изменяются значения т.есть происходит запись и это нормально что в этот момент можно просто взять и прибить файл куда пишется?
А чем это лучше того, что ты убьёшь файл после окончания записи? Файл всё равно же исчезнет 🙂
>а программа случайно не сойдет с ума?
Не сойдёт. Linux удаляет файлы только после того, как освободится последний дескриптор. Даже если программа читает файл, а не пишет. Файл будет удалён только после того, как им перестанут пользоваться.
Это, кстати, и позволяет, например, спокойно обновлять системные библиотеки прямо в работающей системе. Софт, который эти .so открыл и держит будет работать со старым вариантом, пусть он уже даже стёрт и перезаписан. Вновь запускаемая программа будет работать уже с новой версией. Старая версия будет жива (хотя и невидима для пользователя), пока есть хоть один процесс, использующий её.
5.1.5.1. Удаление открытых файлов
С самых первых дней Unix было возможно удалять открытые файлы. Просто вызовите unlink() с именем файла после успешного вызова open() или creat().
На первый взгляд, это кажется странным. Поскольку система освобождает блоки данных, когда счетчик ссылок на файл достигает нуля, возможно ли использовать открытый файл?
Ответ — да, вы можете продолжить использовать открытый файл обычным способом. Система знает, что файл открыт, поэтому она откладывает освобождение хранилища файла до тех пор, пока не будет закрыт последний дескриптор файла. Когда файл вообще больше не используется, память освобождается.
Эта операция также оказывается полезной: это простой способ для программы получить временный файл, который гарантированно будет и конфиденциальным, и автоматически освобождаемым по завершении использования.
/* Получение конфиденциального временного хранилища,
проверка ошибок для краткости опущена */
mode_t mode = O_CREAT | O_EXCL | O_TRUNC | O_RDWR;
fd = open(«/tmp/myfile», mode, 0000); /* Открыть файл */
unlink(«/tmp/myfile»); /* Удалить его */
/* . продолжить использование файла. *
close(fd); /* Закрыть файл, освободить память */
Недостатком такого подхода является то, что вышедшее из-под контроля приложение может заполнить систему открытыми, но анонимными файлами, в этом случае администраторам придется попытаться найти и завершить этот процесс. В прежние дни могли потребоваться перезагрузка и проверка целостности файловой системы; к счастью, на современных системах это требуется исключительно редко.
Читайте также
4.4.2.2. Закрытие всех открытых файлов
4.4.2.2. Закрытие всех открытых файлов Открытые файлы наследуются порожденными процессами от своих родительских процессов. Фактически они являются общими. В частности, общим является положение в файле. Подробности мы оставим для дальнейшего обсуждения в разделе 9.1.1.2
11.4.4. Удаление файлов
11.4.4. Удаление файлов Удаление файла — это удаление указателя на его inode и удаление содержимого файла, если не остается ни одой жесткой ссылки на него. Если любой процесс держит файл открытым, то inode этого файла предохраняется до тех пор, пока финальный процесс не закроет
Удаление файлов занятий
Удаление файлов занятий После завершения работы с книгой, можно освободить дисковое пространство, удалив файлы занятий, установленные с компакт- диска. Процедура удаления удалит все, что было создано в папках с файлами занятий во время выполнения упражнений.1. На панели
12.2 Копирование, перемещение и удаление файлов
12.2 Копирование, перемещение и удаление файлов Хоть я и обещал не объяснять основы использования компьютера, позволю вам напомнить несколько полезных сочетаний клавиш, используемых для управления файлами и папками:• Ctrl—C — копировать выделенные объекты в буфер
Удаление файлов и папок
Удаление файлов и папок С помощью команд rundll32.exe можно удалить каталог или файл. Для этого достаточно воспользоваться приведенной далее командой: rundll32.exe ADVPACK.dll, DelNodeRunDLL32 «путь к кaтaлогу или файлу». Функция DelNodeRunDLL32 была написана специально для вызова с помощью команды
Удаление файлов
Удаление файлов Удаление файлов напоминает их копирование, поэтому рассмотрим этот процесс лишь поверхностно — в подсказках к листингу 15.8. Для определения блоков, содержащих описания удаляемых файлов, используется ключевое слово DelFiles.Листинг 15.8. Удаление
Закрытие открытых файлов
Закрытие открытых файлов Будьте аккуратными — после того как работа с файлами завершена, их следует закрыть.Закрытие файла гарантирует, что все хранимые в памяти изменения действительно будут записаны на диск, а ресурсы, занимаемые файлами, освободятся и станут
Копирование, изменение и удаление файлов
Копирование, изменение и удаление файлов С помощью подходящих методов объект File можно скопировать, переместить или удалить:objFilel.Сору «с:героические усилия»objFilel.Move «с:минимальные результаты»objFile l.DeleteЗаметьте, что если вы не меняете имя файла, в операторах, использующих
20.3.3. Удаление файлов в Unix необратимо
20.3.3. Удаление файлов в Unix необратимо Пользователи с опытом работы в системе VMS или те, кто помнит TOPS-20, часто испытывают недостаток средств для контроля версий файлов, которые были характерны для этих систем. Открытие существующего файла для записи или удаления
20.3.3. Удаление файлов в Unix необратимо
20.3.3. Удаление файлов в Unix необратимо Пользователи с опытом работы в системе VMS или те, кто помнит TOPS-20, часто испытывают недостаток средств для контроля версий файлов, которые были характерны для этих систем. Открытие существующего файла для записи или удаления фактически
12.5. Удаление файлов и каталогов
12.5. Удаление файлов и каталогов Постановка задачи Вы создали на диске ряд файлов и/или каталогов, и они вам больше не нужны. Вы хотите их
Пример 28-1. Удаление cookie-файлов
Пример 28-1. Удаление cookie-файлов if [ -f ~/.netscape/cookies ] # Удалить, если имеются.then rm -f ~/.netscape/cookiesfiln -s /dev/null ~/.netscape/cookies# Теперь, все cookie-файлы, вместо того, чтобы сохраняться на диске, будут «вылетать в трубу»./dev/zeroПодобно псевдоустройству /dev/null, /dev/zero так же является
4.2.4. Удаление файлов и папок. Корзина
4.2.4. Удаление файлов и папок. Корзина Удалить файл (папку) очень просто — щелкните на нем правой кнопкой мыши и выберите команду Удалить (или нажмите клавишу <Del> на клавиатуре). Можно удалить сразу группу файлов и папок: для этого сначала выделите группу объектов, а затем
Удаление файлов и папок
Удаление файлов и папок Удалить файл или папку гораздо проще, чем, например, скопировать или переименовать. Для удаления объектов существует несколько способов. Чтобы удалить ненужный файл, достаточно знать один способ. Однако чтобы по ошибке не удалить нужный объект,
Удаление файлов
Удаление файлов Если определенные файлы становятся ненужными, их можно выбросить в корзину (не в прямом смысле, конечно). Как это сделать?1) Отметим объекты, которые необходимо удалить.2) Щелкнем правой кнопкой мыши на одном из отмеченных значков и выберем в появившемся
(Как) работает удаление открытых файлов в Linux и файловая система FAT?
Мне понятно, как удаление открытых файлов работает в файловых системах, использующих inode — unlink() просто уменьшает количество ссылок до нуля, и когда последний дескриптор файла для файла будет закрыт, индекс будет удален. Но как это работает при использовании файловой системы, которая не использует inode, например FAT32, с Linux? Некоторые эксперименты предполагают, что удаление открытых файлов все еще возможно (в отличие от Windows, где вызов unlink не будет успешным), но что происходит, когда файловая система нечисто демонтируется? Как Linux помечает файлы как несвязанные, если сама файловая система не поддерживает такую операцию? Является ли запись каталога только что удаленной, но сохраненной в памяти (это гарантировало бы удаление после размонтирования в любом случае, но оставило бы файловую систему в несовместимом состоянии), или удаление будет отмечено только в памяти и записано во время последний дескриптор файла закрыт, чтобы избежать возможного повреждения, но восстановить удаленные файлы после нечистого размонтирования?
1 ответ 1
Вы правы в своем предположении, что, хотя все записи каталога удаляются сразу после вызова unlink(), фактические блоки, которые физически составляют файл, очищаются на диске только тогда, когда ничто больше не использует inode. (Я говорю « записи каталога », потому что в vfat файл может иметь несколько таких файлов, потому что реализована поддержка длинных имен файлов в vfat.) В этом контексте под индексом я подразумеваю структуру в памяти, которую ядро Linux использует для обработки файлов. Он используется даже тогда, когда файловая система не «основана на inode». В случае vfat, inode просто поддерживается некоторыми блоками на диске. Взглянув на исходный код ядра Linux, мы видим, что vfat_unlink , который реализует системный вызов unlink() для vfat, делает примерно следующее (чрезвычайно упрощено для иллюстрации):
static int vfat_unlink(struct inode *dir, struct dentry *dentry)
- fat_remove_entries просто удаляет запись для файла в своем каталоге.
- clear_nlink устанавливает счетчик ссылок для индекса на 0 , что означает, что ни один файл (то есть, нет записи в каталоге) больше не указывает на этот индекс.
Обратите внимание, что на этом этапе ни inode, ни его физическое представление никак не затрагиваются (за исключением уменьшенного количества ссылок), поэтому он все еще счастливо существует в памяти и на диске, как будто ничего не произошло!
(Кстати, также интересно отметить, что vfat_unlink всегда устанавливает счетчик ссылок на 0 а не просто уменьшает его с помощью drop_link . Это должно предупредить вас, что файловые системы FAT не поддерживают жесткие ссылки! И еще одно указание на то, что FAT сама не знает какой-либо отдельной концепции inode.)
Теперь давайте посмотрим, что происходит, когда инод выселяется. evict_inode вызывается, когда нам больше не нужен индекс в памяти. В самом начале, это, конечно, может произойти только тогда, когда ни один процесс больше не удерживает дескриптор открытого файла для этого inode (но теоретически может произойти и позже). Реализация FAT для evict_inode выглядит (опять же, упрощенно) так:
static void fat_evict_inode(struct inode *inode) < truncate_inode_pages(&inode->i_data, 0); if (!inode->i_nlink) < inode->i_size = 0; fat_truncate_blocks(inode, 0); > invalidate_inode_buffers(inode); clear_inode(inode); >
Магия происходит именно в if -clause: если счетчик ссылок inode был равен 0, это означает, что ни одна запись каталога не указывает на него. Таким образом, мы устанавливаем его размер равным 0 и фактически усекаем его до 0 байт, что фактически удаляет его с диска путем очистки блоков, из которых он был сделан.
Итак, повреждение, которое вы испытываете в своих экспериментах, легко объяснимо: как вы и подозревали, запись каталога уже была удалена (с помощью vfat_unlink ), но, поскольку индекс не был удален, фактические блоки все еще не были затронуты и были все еще отмечен в FAT (сокращение от таблицы размещения файлов) как используется. Однако fsck.vfat обнаруживает, что в каталоге нет записи, которая больше указывает на эти блоки, жалуется и исправляет ее.
Кстати, CHKDSK не только очистит эти блоки, пометив их как свободные, но и создаст новые файлы в корневом каталоге, указывающие на первый блок в каждой цепочке, с такими именами, как FILE0001.CHK .