Припустимо, я читаю (cat) файл, поки інший процес переписує його вміст. Чи прогнозований вихід? Що б сталося?
Припустимо, я читаю (cat) файл, поки інший процес переписує його вміст. Чи прогнозований вихід? Що б сталося?
Відповіді:
Це залежить від того, що робить письменник.
Якщо автор перезаписує існуючий файл, то читач побачить новий вміст, коли автор переганяє читача, якщо і коли-небудь. Якщо письменник і читач рухаються з різною швидкістю, читач може альтернативно бачити старий і новий вміст.
Якщо автор врізає файл до того, як він почне записувати, читач запустить проти кінця файлу в той момент.
Якщо автор створить новий файл, після чого перемістить новий файл на стару назву, читач продовжує читати зі старого файлу. Якщо відкритий файл переміщено або видалено, процеси, у яких відкритий файл, продовжують читати з цього ж файлу. Якщо файл буде видалений, він фактично залишається на диску (але не може його знову відкрити), поки останній процес не закриє його.
Системи Unix, як правило, не мають обов'язкових блокувань . Якщо програма хоче забезпечити, щоб її компонент запису та компонент для читання не наступали на пальці ніг один одного, розробник повинен використовувати належне блокування. Є кілька винятків, коли файл, відкритий ядром, може бути захищений від запису користувальницькими програмами, наприклад, зображення файлової системи з контуром або виконуваний файл, який виконується в деяких варіантах unix.
ftp/ sftpсценаріях? Скажімо, процес починає читати переданий ftpфайл, тоді як інша версія того ж файлу перезаписує його через нову передачу.
Це класична умова гонки, тому результат за визначенням непередбачуваний.
Серед іншого, це залежить від
fopen(3)або open(2)режими запису,Якщо вам потрібно мати можливість читати файл під час його перезапису, ви можете змусити письменника зробити перехідну копію файлу, змінити його, а потім скопіювати його назад у вихідний файл. Це шлях rsyncробить це, наприклад. Існує ряд способів цього здійснити, але безкоштовний обід немає. У кожного методу є свої недоліки та наслідки.
Попередні респонденти мають більш вичерпні пояснення, ніж це, але ось фокус, який, безумовно, також працює, і він робить саме те, що хоче:
$ tail -f <filename>
Покаже вам кінець файлу під час його написання. Зручно, якщо ви хочете передати STDERR у файл, але все-таки бачити його, наприклад, у іншому вікні терміналу.