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

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

Предположим, я читаю (cat) файл, пока другой процесс переписывает его содержимое. Является ли вывод предсказуемым? Что произойдет?

решение1

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

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

Если записывающий процесс обрезает файл до начала записи, считывающий процесс в этой точке достигнет конца файла.

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

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

решение2

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

Среди прочего, это зависит от

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

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

решение3

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

$ tail -f <filename>

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

Связанный контент