Информация об изменениях

Сообщение Re[6]: Сходи хоть на одно собеседование, узнаешь о себе мног от 21.10.2022 1:04

Изменено 21.10.2022 1:10 vsb

Re[6]: Сходи хоть на одно собеседование, узнаешь о себе мног
Здравствуйте, cppguard, Вы писали:

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


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

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

А как правильно? Я вообще в системном программировании ни гу-гу. Наверное через какие-то ioctl-ы должен быть доступ к такой информации, я бы в этом направлении ещё покопал.
Re[6]: Сходи хоть на одно собеседование, узнаешь о себе мног
Здравствуйте, cppguard, Вы писали:

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


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

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

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

А как правильно? Я вообще в системном программировании ни гу-гу. Наверное через какие-то ioctl-ы должен быть доступ к такой информации, я бы в этом направлении ещё покопал.