Использование системных вызовов read () и write () для доступа к mmapped() памяти

#c #linux #mmap

#c #linux #mmap

Вопрос:

Я хотел бы спросить, возможно ли реализовать функцию mread (), используя только системные вызовы, такие как read() и write (). Я знаю, что стандартные функции библиотеки C, такие как fread() и fwrite(), используют тип буфера для чтения. Я хочу сделать то же самое, но на этот раз я хочу читать () и записывать () из буфера в область, отображенную в памяти, и наоборот. Например, мой mread () хочет прочитать из карты памяти и сохранить в буфер. Имеет ли смысл создавать новый fd только для того, чтобы использовать его в качестве моего ВРЕМЕННОГО буфера. Затем я использую read () для чтения из области, отображенной в памяти, в fd .. а затем использую write () для сохранения содержимого в fd в моем фактическом буфере.
Надеюсь, я ясно выразился 🙂 .. Спасибо за вашу помощь!

Комментарии:

1. Почему вы не используете простой memcpy?

2. Поскольку memcpy() не является системным вызовом, я прав? Это стандартная функция C …. и мы можем использовать только системные вызовы…

3. Да, я знаю, но я спрашиваю, почему. Почему вы должны использовать только системные вызовы?

4. Причина в том, чтобы понять, как они на самом деле работают, поскольку это назначение..

5. Буфер, который используют fread и fwrite, не управляется с помощью системных вызовов, насколько я знаю. На самом деле fread использует read для дополнительного ввода запрошенных данных и помещает прочитанные данные в буфер, а fwrite memcpy — в буфер и очищает буфер с помощью write, когда он заполнен, или файл закрыт, или что-то в этом роде. Поскольку вы используете память mmaped, вы можете изменять ее напрямую, без системных вызовов, и данные сохраняются на диск, когда ОС сочтет это целесообразным, или когда вы явно запрашиваете их с помощью msync. Если вы хотите создать свою собственную версию или fread-fwrite, не используйте mmap.

Ответ №1:

Надеюсь, я ясно выразился

К сожалению, не очень. Но звучит так, как будто вы хотите использовать pipe системный вызов. Это открывает два fd. Все, что записано на стороне записи, может быть прочитано на стороне чтения. Однако, если вы выполняете все это в одном потоке, вам нужно быть осторожным, потому что у вас может закончиться место в буфере, и вызов read / write тогда зависнет на неопределенный срок.