Системи Unix за великим рахунком уникають обов'язкових блокувань. Є кілька випадків, коли ядро заблокує файл проти модифікацій програм користувача, але це не так, якщо це просто записується іншою програмою. Жодна система Unix не заблокує файл, тому що програма пише на нього.
Якщо ви хочете, щоб одночасні екземпляри вашого сценарію не наступали на пальці ніг один одного, вам потрібно використовувати явний механізм блокування, наприклад .flock
lockfile
Коли ви відкриваєте файл для додавання, це >>
робить кожна програма гарантовано завжди записувати до кінця файлу. Таким чином, вихід декількох екземплярів ніколи не перезаписує один одного, і якщо вони по черзі пишуть, їх вихід буде в тому ж порядку, що і запис.
Погано, що може статися, це якщо один з екземплярів напише кілька фрагментів результату і очікує, що вони вийдуть разом. Між послідовними записами одним екземпляром інші інстанції можуть виконувати свої власні записи. Наприклад, якщо 1 екземпляр пише foo
, то записує екземпляр 2 hello
і лише потім пише примірник 2 bar
, тоді файл буде містити foohellobar
.
Процес ефективно записує у файл, коли він викликає write
системний виклик. Заклик до write
атомарний: кожен виклик write
записує послідовність байтів, які не будуть перервані іншими програмами. Часто існує обмеження кількості даних, write
які ефективно записуватиме один дзвінок : для більших розмірів записується лише початок даних, і програма повинна дзвонити write
знову. Крім того, багато програм виконують буферизацію: вони накопичують дані в області пам’яті, потім записують ці дані в один шматок. Деякі програми промивають вихідний буфер після завершення рядка або іншого змістовного розділення. З такими програмами ви можете очікувати, що цілі лінії будуть безперебійними, якщо вони не надто довгі (до кількох кілобайт; це залежить від ОС). Якщо програма не розмивається на значущих місцях, а лише на основі розміру буфера, ви можете побачити щось на зразок 4 кБ від одного екземпляра, потім 4 кБ від іншого екземпляра, потім знову 4 кБ від першого екземпляра тощо.