2016-12-26 2 views
2

Я конвертирую некоторый код C для малины Pi 3B в C++. Эта часть кода С,Заменить сопоставление памяти C с эквивалентами C++

// Open /dev/mem 
    if ((p->mem_fd = open("/dev/mem", O_RDWR|O_SYNC)) < 0) { 
     printf("Failed to open /dev/mem, try checking permissions.\n"); 
     return -1; 
    } 

    p->map = mmap(
     NULL, 
     BLOCK_SIZE, 
     PROT_READ|PROT_WRITE, 
     MAP_SHARED, 
     p->mem_fd,  // File descriptor to physical memory virtual file '/dev/mem' 
     p->addr_p  // Address in physical map that we want this memory block to expose 
    ); 

представляет собой сложную задачу. Непосредственная проблема связана с дескриптором файла, возвращаемым функцией C open. C++ использует fstream, который будет работать для открытия файла, но когда я доберусь до функции C mmap, у меня нет файлового дескриптора.

mmap отображает файлы в память.

Это учебный эксперимент, и я хотел бы придерживаться C++.

Это вопрос. RPi OS, Raspbian, имеет встроенные все эти функции C. Имеет ли он также встроенные эквиваленты C++ или ожидается, что один использует функции C и, возможно, оператор extern "C"?

+0

C++ - это почти строгий надмножество C (см. [Здесь] (http://stackoverflow.com/questions/1201593/c-subset-of-c-where-not-examples)). Хотя вы можете преобразовать это в C++, он также может оставаться как C. –

+0

@EliSadoff: Это неправильно! C++ не является даже «почти» строгим надмножеством C. Существует множество часто используемых идеомов, которые имеют разные семантики на обоих языках. Это могло бы отличаться от стандарта C и современного C99, но это совершенно неправильно с 17 лет. – Olaf

+1

@Olaf Я явно связан с (неисчерпывающим) списком раз, когда это неверно. «Почти» - субъективное определение, и для целей этого вопроса этот код действителен как для C, так и для C++. –

ответ

-1

Вы можете achive то, что вы хотите с boost::interptocess

http://www.boost.org/doc/libs/1_57_0/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.mapped_file

Я любопытным, что ваша проблема с ттар в C++ код?

+0

paweldac, функция 'mmap' работает хорошо. Тем не менее, я был под ошибочным впечатлением, что это C-конструкция и нецелесообразно использовать в приложении C++. Я не пытаюсь быть чистейшим, но стараюсь быть совместимым с C++, поскольку я узнаю то же самое на RPi. Я понимаю, что UNIX/Linux написано на C. Мое замешательство приходит снова: смешивание C и C++. Замечание от Barmar о 'open()' и 'mmap()' не является C-специфическим, но функции POSIX интересны тем, что функция 'mmap()', работающая в коде C++ **, без ** необходимости использовать ' extern "C". – user34299

+0

@ user34299 mmap не C специфический, это * nix специфический. В C++ вызовы, подобные mmap, должны быть скрыты от пользователя в nice named object или function, если класс не нужен. Предлагаемая библиотека может отображать память в память в более «C++-стиле», но где-то в реализации она также использует mmap или эквивалент на non-poxis sysytem (например, windows) – paweldac

Смежные вопросы