Re[6]: Сходи хоть на одно собеседование, узнаешь о себе мног
От: vsb Казахстан  
Дата: 21.10.22 01:04
Оценка:
Здравствуйте, cppguard, Вы писали:

C>А кто определяет, что являетя базовым, а что нет? Вот, например, задачка на основе "базовых вещей": нужно написать функцию, которая пишет в файл с использованием non-blocking I\O. То есть, пишет сколько может, а потом сообщает о переполнении буффера записи. И если сразу не увидели подвох, а знание "базовых вещей" подвело, то даю подсказку: non-blocking I\O не работает для обычных файлов. Но у вас вот такая вот система, что FS смонтирована через NFS, но доступа к драйверу NFS нет. Как-то нужно выкрутиться. Задача вполне реальная с прошлого проекта, решается стандартными средствами системного программирования.


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

Разновидность этого варианта — запустить второй процесс, в котором записывать в файл в обычном виде (аналог "cat > file") и через pipe в stdin ему данные для записи передавать. На pipe уже можно неблокирующий режим включить по идее. Это прям совсем юниксово, хотя лишний процесс это наверное чуть больше накладных расходов, чем поток.

Если выпендриваться, я бы через io_uring попробовал, вроде он поддерживает асинхронную запись в файлы.

А как правильно? Я вообще в системном программировании ни гу-гу. Наверное через какие-то ioctl-ы должен быть доступ к такой информации, я бы в этом направлении ещё покопал.
Отредактировано 21.10.2022 1:10 vsb . Предыдущая версия . Еще …
Отредактировано 21.10.2022 1:06 vsb . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.