Что происходит, когда Вы читаете файл, в то время как он перезаписывается?

Я просто хотел, говорят, что это не удаляет другие установленные ядра, Вам, возможно, понадобится один из них однажды. Это на самом деле произошло со мной, я должен был обновить свою человечность, и это установило новую версию ядра после этого. перезагрузка выбирая новое ядро, это crashs! (Я предполагаю, что мой драйвер VGA не был совместим с новой версией ядра или чем-то как этот). Любым путем я перезагрузил выбор старого ядра, и это начинает хорошо работать.

Моя точка является отпуском по крайней мере один, который работает помимо недавно установленного, Вы можете собирающийся потребность это однажды.

26
26.06.2012, 16:38
3 ответа

Это зависит от того, что делает устройство записи.

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

Если устройство записи усечет файл, прежде чем он начнет писать, читатель будет работать против конца файла в той точке.

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

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

19
27.01.2020, 19:40
  • 1
    Gilles, делает Ваше объяснение, также применяются в ftp/sftp сценарии? Скажите, что процесс начинает читать переданный ftp файл, в то время как другая версия того же файла перезаписывает его из-за новой передачи. –  iruvar 04.08.2014, 23:27
  • 2
    @1_CR Да. В этом случае устройство записи и средство чтения являются процессами ftpd. –  Gilles 'SO- stop being evil' 05.08.2014, 00:46
  • 3
    , каково значение, настигает здесь? –  Victor Choy 10.10.2016, 10:02
  • 4
    @VictorChoy: запускаться позади/после того, как кого-то еще и в какой-то момент перемещаться перед ними. –  Gilles 'SO- stop being evil' 10.10.2016, 20:50

Это - классическое состояние состязания, таким образом, результат непредсказуем по определению.

Среди других это зависит от

  • fopen(3) или open(2) режимы записи,
  • как/если устройство записи буферизует его вывод,
  • как читатель читает файл,
  • различие в скорости между средством чтения и устройством записи,
  • разница во времени между чтением и запуском писателя.
  • И конечно, на современных многоядерных машинах, вещи являются сложными еще больше другими факторами, опускаются (например, диспетчеризация процессов).

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

18
27.01.2020, 19:40
  • 1
    Этот ответ является намного более всесторонним, чем мой. Удаление моего ответа. –  killermist 26.06.2012, 17:22

Предыдущие респонденты давали более полные объяснения, чем это, но вот прием, который определенно работает, делая в значительной степени именно то, что он хочет:

$ tail -f <filename>

Покажет конец файла в процессе его записи. Удобно, если вы хотите передать STDERR в файл, но все еще видите его, например, в другом окне терминала.

0
27.01.2020, 19:40

Теги

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