если родительский и дочерний процессы присоединяются к одному и тому же файлу, должны ли lseek () и write () быть атомарными? - PullRequest
0 голосов
/ 05 ноября 2018

Постановка задачи

Один процесс открывает файл для добавления (предположим, что O_APPEND отсутствует, добавление здесь означает сначала lseek() до конца файла, затем write()), а затем разветвляется дочерний элемент. Два зависимых процесса добавляются в файл одновременно. Предположим, что lseek() и write() являются атомными. Приведите пример, чтобы обсудить необходимость использования lseek() и write() в качестве атомарной операции в этом сценарии.

Мои мысли

  1. Текущее смещение файла сохраняется в записи в таблице открытых файлов, и эта запись используется двумя зависимыми процессами.
  2. 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() все еще должны быть одной атомарной операцией в этом конкретном случае?

1 Ответ

0 голосов
/ 12 ноября 2018

Оказалось, что эта формулировка заставляет меня задавать вопросы.

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

...