Постановка задачи
Один процесс открывает файл для добавления (предположим, что O_APPEND отсутствует, добавление здесь означает сначала lseek()
до конца файла, затем write()
), а затем разветвляется дочерний элемент. Два зависимых процесса добавляются в файл одновременно. Предположим, что lseek()
и write()
являются атомными. Приведите пример, чтобы обсудить необходимость использования lseek()
и write()
в качестве атомарной операции в этом сценарии.
Мои мысли
- Текущее смещение файла сохраняется в записи в таблице открытых файлов, и эта запись используется двумя зависимыми процессами.
write()
обновляет смещение до конца только что записанных данных.
Эти 2 пункта гарантируют, что даже в следующем сценарии данные, записанные P2
, не будут перезаписаны P1
.
P1 lseek()
P2 lseek()
P2 write() // after this operation, the offset still points to the file end
P1 write()
Моя проблема
Итак, lseek()
и write()
все еще должны быть одной атомарной операцией в этом конкретном случае?