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

POSIX споделена памет с програмиране на C

POSIX споделена памет с програмиране на C
Споделената памет на POSIX е рамка за комуникация между процесите (IPC), посочена в спецификациите на POSIX. Две (или повече) задачи могат да четат от него и да записват в зоната на споделената памет, докато установяват споделената памет. Споделената памет POSIX не винаги налага изплащане на копия, за разлика от други IPC структури (напр.ж., тръба, гнездо и др.) и е желателно за определени програми.

Обаждания в споделена памет 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, включително всяко повикване на функция, използвано за установяване на споделена памет. Надявам се, че тази статия ви е помогнала да подобрите познанията си по програмиране и е обхванала всяко съмнение по този въпрос.

Курсорът скача или се движи произволно, докато пишете в Windows 10
Ако установите, че курсорът на вашата мишка скача или се движи самостоятелно, автоматично, произволно, докато пишете в лаптоп или компютър на Windows,...
Как да обърнете посоката на превъртане на мишката и тъчпада в Windows 10
Мишка и Тъчпадs не само правят изчисленията лесни, но и по-ефективни и отнемат по-малко време. Не можем да си представим живот без тези устройства, но...
Как да промените курсора на мишката и размера на курсора, цвета и схемата в Windows 10
Показалецът на мишката и курсорът в Windows 10 са много важни аспекти на операционната система. Това може да се каже и за други операционни системи, т...