Поведение Unix с двумя разными процессами, удерживающими дескриптор в одном и том же файле, и одним процессом, удаляющим файл - PullRequest
3 голосов
/ 14 февраля 2011

Я новичок в Unix.У меня есть два процесса, удерживающие дескрипторы (файловые дескрипторы) одного и того же файла на диске.

Пусть процессы будут A, B, а файл sample.txt скажет

Процесс A является производителем (записывает данные в файл на диске), а процесс B является потребителем (читает с диска).file).

Процесс A достиг точки, когда он закрыл дескриптор файла (дескриптор) для файла файла sample.txt, удалил файл с диска и открыл новый файл с тем же именем "sample.txt"и начал писать в новый файл.Между тем процесс B все еще имеет старый дескриптор, который указывает на старый файл, который был удален процессом A.

Теперь, что происходит, когда процесс B пытается прочитать файл, используя свой старый дескриптор, и все еще сможетполностью прочитать старый файл "sample.txt" до конца?

Гуру Unix, пожалуйста, пролите немного света на это.Любые указатели на документы ядра Unix приветствуются.

1 Ответ

2 голосов
/ 14 февраля 2011

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

Изменить 0:

Немного подробнее - каждый файл в файловой системе представлен inode, тогда несколько каталогов могут указывать наэто (это жесткие ссылки ).Таким образом, здесь есть два числа ссылок - количество ссылок на диске и число вызовов в ядре open(2) для данного файла (независимо от того, через какую ссылку).Файл удаляется только, т. Е. Его inode перерабатывается, когда оба счетчика стремятся к нулю.

Чтобы перевести это на ваш пример - Когда процесс A удаляет исходный файл, запись каталога удаляетсяinode счетчик ссылок обнуляется, но не open() -счет.inode все еще не свободен, пока процесс B не вызовет close(2).

...