Альтернатива lseek для хвоста файла (Posix)
Я должен был реализовать версию tail
(системный вызов posix). Я сделал это используя lseek
а также pread
, (Я достигаю конца моего файла, затем ищу правильную позицию смещения, а затем читаю из этой позиции с помощью pread и записываю в стандартный вывод до конца файла). Но теперь я должен реализовать другую версию tail без lseek. Вопрос в следующем:
"Предыдущая версия не работает, если файл не поддерживает обращения к lseek
, Приведите случаи, когда это происходит. Предложите решение (которое вы не будете реализовывать) для решения этой проблемы. "
Я не понимаю, как мы можем обойтись без lseek
...
Если есть идея, буду очень признателен:)
Большое спасибо!
2 ответа
Приведите случаи, когда это происходит.
Для этого мы проверим страницу руководства, чтобы увидеть, какие ошибки lseek
может вернуться.
EBADF fd не является дескриптором открытого файла.
Ошибка использования. Не имеет значения.
EINVAL, откуда не действует. Или: результирующее смещение файла будет отрицательным или находится за пределами конца доступного для поиска устройства.
Ошибка использования. Не имеет значения.
EOVERFLOW Результирующее смещение файла не может быть представлено в off_t.
Очень большие файлы. Соответствующий.
ESPIPE fd связан с каналом, сокетом или FIFO.
Соответствующий.
ENXIO, откуда SEEK_DATA или SEEK_HOLE, а текущее смещение файла находится за пределами конца файла.
Ошибка использования. Не имеет значения.
Файл сжался. Соответствующий.
Предложите решение (которое вы не будете реализовывать) для решения этой проблемы.
EOVERFLOW
Это можно решить, переключившись на
lseek64
, Это позволит вам работать с файлами размером до 8 exbibyte. (Это 8 589 934 592 ГиБ.)ESPIPE
Трубы, розетки и пятерки на самом деле гораздо проще, чем обычные файлы. Читая один из них,
read
заблокирует ожидание большего количества данных вместо возврата, когда вы достигнете их конца. Нет причин использовать алгоритм сложного поиска, используемый для простых файлов; можно просто позвонитьread
в петле.ENXIO
Хвост файла по своей природе предполагает, что единственная модификация, которую вносят в файл, являющийся хвостом, это добавление новых строк. Эта ошибка указывает на то, что в файл были внесены другие изменения. Это ошибка, которую нельзя избежать.
tail
выдает предупреждение (file truncated
) и переходит к хвосту от нового EOF.
Просто читайте и отбрасывайте данные до конца, сохраняя последние пару строк в кольцевом буфере.