Обаждания в споделена памет POSIX
Функциите на споделена памет POSIX се фокусираха върху концепцията на UNIX, че обектът трябва да бъде документ, когато извършва дейности по въвеждане / извеждане на обект. Следователно, тъй като рецитирате и записвате на взаимен обект на памет POSIX, последният трябва да се разглежда като документ. Картираният в памет документ е обект на споделена памет POSIX. За да използвате shm_open функция за системно повикване отдолу / dev / shm, генерират се отделни документи за споделена памет. Има само две специализирани системни повиквания за споделена памет от POSIX, shm_open, и shm_unlink, които са тясно свързани с отваряне и прекратяване на връзките с файлова система. The 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 * name);ftruncate ()
При задаване на обекта, ftruncate () методът се отхвърля, за да зададе размера на обекта в байтове. Определението на функцията е както следва:
>> Int ftruncate (int fd, off_t дължина);Когато се изгражда споделена POSIX памет, това наистина е нула байта по размер. Можете да изобразите обекта на споделена памет POSIX с байтове с дължина на размера чрез ftruncate. Ftruncate дава нула при изпълнение. Ftruncate извежда -1 в случай на повреда и грешно е настроен да задейства грешката.
mmap ()
В крайна сметка чрез карта се задава документ с карта на паметта с обект на споделена памет mmap () метод. След това той дава указател на документ, картографиран в паметта, който се изхвърля, за да достигне обекта на споделената памет. Следва дефиницията на mmap () функция:
>> Void * mmap (void * addr, size_t length, int prot, int flags, int fd, off_t offset);В това „addr“ е адресът, на който ще бъде картографиран. „Дължината“ е обхватът на споделената памет. Стойностите за prot може да се различават, но ние ще използваме PROT READ | PROT ПИШЕТЕ. Има няколко флага, но MAP SHARED е от съществено значение за споделената памет. Сега 'fd' е дескриптор на документ, получен по-рано. Offset е точката, в която картографирането започва в обекта на споделената памет; може да се използва и стойността на отместването 0. На завършване, mmap () дава показалеца към позицията за картографиране на обекта на споделената памет.
munmap ()
В позицията, насочена от addr и получаване на размер, дължина, munmap демапира елемента от споделената памет. Munmap дава 0 при завършване и -1 в случай на неточност, в този случай се присвоява errno за задействане на грешката.
>> Void munmap (void * addr, size_t length);Пример: Изпращач и получател
Нека вземем примера на подателя и получателя. Подателят ще създаде нов обект на споделена памет с името / shmem-пример и чрез него впишете три цифри в споделената памет. Сега приемникът може да изложи обекта на споделената памет и да изрече трите цифри от паметта. Ще създадем три файла с имената протокол.ч, подател.° С, и приемник.° С.
$ touch протокол.з$ touch подател.° С
$ touch приемник.° С
След това ще добавим изходния код по-долу към протокола на файловете.з, "подател.c, „и“ приемник.° С.- Сега ще спасим всички и ще ги затворим.
Сега ще компилираме и ще се присъединим към горния код, като използваме ключовата дума -lrt отделно за подателя.c и приемник.c файл. Ето командата за това:
$ gcc -o подател подател.c -lrt$ gcc -o приемник приемник.c -lrt
Сега ще стартираме кода на подателя, като използваме следната команда. Резултатът е даден по-долу.
$ ./ подател
Изпълнявайки кода на подателя, обектът от споделената памет е генериран и може да бъде намерен отдолу / dev / shm използвайки командата по-долу:
$ ls -l / dev / shm | grep shmem-пример
Когато стартираме кода на приемника, ще получим изхода по-долу:
$ ./ приемник
Винаги когато функцията gm_unlink () се нарича с помощта на приемника на файла.c, 'обектът / dev / shm / shmem-пример ще бъде отделен. В този случай няма да получите обект на изхода, както е показано по-долу.
$ ls -l / dev / shm / shmem-пример
Заключение
В тази статия научихте как да използвате POSIX споделена памет с програмиране на C в Ubuntu 20.04, включително всяко повикване на функция, използвано за установяване на споделена памет. Надявам се, че тази статия ви е помогнала да подобрите познанията си по програмиране и е обхванала всяко съмнение по този въпрос.