Программирование на C

Общая память POSIX с программированием на C

Общая память POSIX с программированием на C
Общая память POSIX - это структура для межпроцессного взаимодействия (IPC), указанная в спецификациях POSIX. Две (или более) задачи могут читать из него и записывать в зону общей памяти при установлении общей памяти. Общая память POSIX не всегда обеспечивает выделение копий, в отличие от других структур IPC (e.грамм., труба, раструб и т. д.), и желательно для некоторых программ.

Вызовы общей памяти POSIX

Функции общей памяти POSIX сосредоточены на концепции UNIX, согласно которой объект должен быть документом при выполнении операций ввода / вывода для объекта. Следовательно, поскольку вы читаете и записываете объект взаимной памяти POSIX, последний должен рассматриваться как документ. Документ с отображением в память - это объект общей памяти POSIX. Чтобы использовать shm_open функция системного вызова ниже / dev / shm, генерируются отдельные документы с общей памятью. Есть только два системных вызова выделенной общей памяти от POSIX, shm_open, а также shm_unlink, которые тесно связаны с открытием и отключением вызовов файловой системы. В ftruncate, mmap, а также munmap вызовы фреймворка для документов используются для выполнения других задач в общей памяти POSIX. Необходимо подключить программу, использующую вызовы разделяемой памяти POSIX, к -lrt.

Программы, использующие вызовы разделяемой памяти POSIX, должны пройти следующие шаги:

С использованием shm_open (), сформировать объект общей памяти. Дескриптор документа можно вернуть обратно, если формирование объекта прошло успешно.

С участием ftruncate (), размер объекта будет фиксированным.

С участием карта() а также MAP_SHARED, очертить этот объект в текущем адресном пространстве.

Чтение / запись в разделяемую память.

Через munmap (), не разграничивать разделяемую память.

Использовать Закрыть() закрыть объект.

Через shm_unlink (), удалить объект из общей памяти.

shm_open ()

Как описано выше, shm_open () используется для создания нового объекта общей памяти. Он делает объект доступным для вызывающей процедуры, используя возвращенный дескриптор. Ниже приводится определение этого вызова функции:

>> Int shm_open (const char * name, int oflag, mode_t mode);

Первый параметр - это имя объекта общей памяти. Это строка с завершающим нулем /название тип, с условием, что никакой другой символ не может быть косой чертой, кроме его первого символа. Oflag - это небольшая завеса, созданная с помощью нескольких предшествующих флагов операцией OR-ing, будь то через O_RDONLY или же O_RDWR. Описанные параметры указывают, что его объект общей памяти должен быть сформирован (O_CREAT), когда он еще не существует, а также объект доступен для чтения и записи (O_RDWR). Самый последний аргумент устанавливает утверждения каталога для объекта общей памяти.

shm_unlink ()

Shm_unlink () устраняет объект разделяемой памяти POSIX, который ранее был разработан. Целочисленный дескриптор документа для объекта общей памяти возвращается через эффективный вызов shm_open (). Как определено ниже shm_open (), имя параметра - это заголовок объекта общей памяти. Ниже приводится определение shm_unlink () функция:

>> Int shm_unlink (const char * имя);

ftruncate ()

После установки объекта ftruncate () отбрасывается, чтобы установить размер объекта в байтах. Определение функции следующее:

>> Int ftruncate (int fd, длина off_t);

При создании разделяемой памяти POSIX размер ее действительно равен нулю. Вы можете отобразить объект общей памяти POSIX с байтами длины размера через ftruncate. Ftruncate дает ноль при исполнении. Ftruncate выводит -1 в случае отказа и errno настроен на запуск ошибки.

mmap ()

В конце концов, документ с отображением памяти с сущностью с общей памятью устанавливается через mmap () метод. Затем он дает указатель на документ с отображением в память, который отбрасывается, чтобы достичь сущности с общей памятью. Ниже приводится определение mmap () функция:

>> Void * mmap (void * addr, size_t length, int prot, int flags, int fd, off_t offset);

Здесь 'addr' - это адрес, на который он будет отображаться. "Длина" - это диапазон объекта разделяемой памяти. Значения prot могут отличаться, но мы будем использовать PROT READ | ЗАПИСАТЬ. Есть несколько флагов, но MAP SHARED необходим для разделяемой памяти. Теперь 'fd' - это дескриптор документа, полученный ранее. Смещение - это точка, в которой начинается отображение в объекте общей памяти; также можно использовать значение смещения 0. По окончании, mmap () дает указатель на позицию отображения объекта общей памяти.

munmap ()

На позицию, указанную адресом и получение размера, длины, munmap отключает отображение разделяемой памяти. Munmap дает 0 по завершении и -1 в случае неточности, и в этом случае errno назначается для запуска ошибки.

>> Void munmap (void * addr, size_t length);

Пример: отправитель и получатель

Возьмем для примера отправителя и получателя. Отправитель создаст новый объект общей памяти с именем / shmem-example и впишите через нее три цифры в общую память. Теперь получатель может открыть объект общей памяти и произнести три цифры из памяти. Мы создадим три файла с именами протокол.h, отправитель.c, а также приемник.c.

$ Touch протокол.час
$ touch отправитель.c
$ сенсорный приемник.c

Затем мы добавим приведенный ниже исходный код в протокол файлов.h, "отправитель.c, 'и' получатель.c.'Теперь мы спасем всех и закроем их.

Теперь мы будем компилировать и присоединять вышеуказанный код, используя ключевое слово -lrt отдельно для отправителя.c и приемник.c файл. Вот как это сделать:

$ gcc -o отправитель отправитель.c -lrt
$ gcc -o приемник-приемник.c -lrt

Теперь мы запустим код отправителя, используя следующую команду. Результат представлен ниже.

$ ./ отправитель

Запустив код отправителя, объект общей памяти был сгенерирован и находится под / dev / shm используя команду ниже:

$ ls -l / dev / shm | grep shmem-example

Когда мы запустим код приемника, мы получим следующий результат:

$ ./приемник

Всякий раз, когда функция gm_unlink () вызывается с помощью файла-приемника.c, 'объект / dev / shm / shmem-пример будет отделен. В этом случае вы не получите никакого объекта на выходе, как показано ниже.

$ ls -l / dev / shm / shmem-пример

Заключение

В этой статье вы узнали, как использовать общую память POSIX с программированием на C в Ubuntu 20.04, включая каждый вызов функции, используемый для установки общей памяти. Я надеюсь, что эта статья помогла вам улучшить свои знания в области программирования и покрыла все ваши сомнения по этому поводу.

Как использовать чит-движок GameConqueror в Linux
В статье содержится руководство по использованию чит-движка GameConqueror в Linux. Многие пользователи, играющие в игры на Windows, часто используют п...
Лучшие эмуляторы игровой консоли для Linux
В этой статье будет перечислено популярное программное обеспечение для эмуляции игровых консолей, доступное для Linux. Эмуляция - это уровень совмести...
Лучшие дистрибутивы Linux для игр в 2021 году
Операционная система Linux прошла долгий путь от своего первоначального простого серверного вида. Эта ОС значительно улучшилась за последние годы и те...