атомарное добавление в файловый дескриптор, но при каком смещении? - PullRequest
3 голосов
/ 17 ноября 2010

в unistd.h

использование open () с флагом O_APPEND дает атомарные записи всегда в конец файла ...

это здорово и все, но что, если мне нужно знать смещение, при котором оно атомарно добавляется в файл ...?

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

Я не вижу очевидного способа сделать это ..? Кто-нибудь знает?

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 ноября 2010

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

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

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

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

0 голосов
/ 17 ноября 2010

Чтобы получить текущую позицию в дескрипторе файла, используйте lseek() со смещением 0 и откуда SEEK_CUR.

int fd = open(...);
if (fd) {
    off_t positionWhereAppendingBegins = lseek(fd, 0, SEEK_CUR);
    write(...);
    close(fd);
}

Обратите внимание, что это не даст вам надежных результатов, если дескриптор был открыт другим способом, то есть через socket().

...