Реализация lseek в xv6

Прежде всего, я должен сказать, что вполне возможно, что я что-то упускаю. Мое задание состоит в том, чтобы по существу реализовать «fprintf». Теперь, хотя добавление к файлу не требуется, мне нравится делать все возможное. Моя проблема в том, что я не могу найти определение для lseek в xv6, что означает, что я должен реализовать его самостоятельно, но я действительно не знаю, как это сделать.

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

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

Я могу довольно хорошо читать xv6 (программы пользовательского уровня), но я не могу понять исходный код lseek на всю жизнь

Это не обязательно должен быть настоящий поиск. Мне просто нужно иметь возможность добраться до конца fd и продолжить запись, но это не может зависеть от файлового режима.

Любая помощь приветствуется.


person Flacarile    schedule 06.06.2019    source источник
comment
Зачем fprintf искать?   -  person melpomene    schedule 06.06.2019
comment
@melpomene Я пытаюсь заставить режим добавления (a) работать правильно   -  person Flacarile    schedule 06.06.2019
comment
fprintf не нужно заботиться о режимах. "a" следует реализовать в fopen (просто передав O_APPEND в open).   -  person melpomene    schedule 06.06.2019
comment
@melpomene Теперь, когда вы упомянули об этом... Я уже передаю O_APPEND в open(). Я нашел что-то в имени определения sys_open 'off', поэтому я думаю, что это смещение. Я возьмусь с этим и посмотрю, смогу ли я заставить O_APPEND работать. Спасибо   -  person Flacarile    schedule 06.06.2019


Ответы (1)


Я нашел решение. Причина, по которой O_APPEND не работает, заключается в том, что определение open() в sysfile.c ничего не делает с добавлением. В sys_open они жестко запрограммировали значение 0 для f->off (смещение), и это то, что мне нужно изменить. Мое запланированное решение состоит в том, чтобы выяснить размер файла (в байтах) файла и установить смещение на это число. Вероятно, я буду использовать stat().

person Flacarile    schedule 06.06.2019