Ц Програмирање

ПОСИКС заједничка меморија са програмирањем на језику Ц

ПОСИКС заједничка меморија са програмирањем на језику Ц
ПОСИКС заједничка меморија је оквир за међупроцесну комуникацију (ИПЦ) наведен у ПОСИКС спецификацијама. Два (или више) задатка могу читати из њега и писати у зону дељене меморије док успостављају дељену меморију. ПОСИКС заједничка меморија не спроводи увек исплате копија, за разлику од других ИПЦ структура (нпр.г., цев, грло итд.), и пожељно је за одређене програме.

Позиви из заједничке меморије ПОСИКС

ПОСИКС функције заједничке меморије фокусирале су се на УНИКС концепт да објекат мора бити документ приликом извођења улазно / излазних активности на ентитету. Стога, пошто рецитујете и уписујете узајамни ПОСИКС меморијски ентитет, овај други се мора сматрати документом. Мапирани меморијски документ је ПОСИКС заједнички меморијски ентитет. Да бисте користили схм_опен функција системског позива испод / дев / схм, генеришу се одвојени дељени документи меморије. Из ПОСИКС-а постоје само два наменска системска позива за заједничку меморију, схм_опен, и схм_унлинк, који су уско повезани са отварањем и прекидањем везе системских позива датотека. Тхе фтрунцате, ммап, и мунмап оквирни позиви за документе користе се за обављање других задатака на ПОСИКС дељеној меморији. Неопходно је повезати програм који користи ПОСИКС позиве из заједничке меморије -лрт.

Програми који користе ПОСИКС позиве из заједничке меморије морају да прођу кроз следеће кораке:

Користећи схм_опен (), чине заједнички меморијски објекат. Дескриптор документа може се вратити ако је формирање објекта успешно.

Са фтрунцате (), величина предмета ће бити фиксна.

Са Мапа() и МАП_СХАРЕД, разграничи овај објекат у садашњи адресни простор.

Читање / писање заједничке меморије.

Виа мунмап (), раздвојити заједничку меморију.

Користите Близу() да затвори предмет.

Кроз схм_унлинк (), обришите објекат у заједничкој меморији.

схм_опен ()

Као што је горе описано, схм_опен () користи се за генерисање новог објекта дељене меморије. Омогућава објекту приступ процедури позивања помоћу враћеног дескриптора. Следи дефиниција овог позива функције:

>> Инт схм_опен (цонст цхар * име, инт офлаг, моде_т моде);

Први параметар је име објекта заједничке меморије. То је нул-завршени низ датотеке / име типа, уз услов да ниједан други знак не може бити коса црта осим његовог првог знака. Офлаг је мали вео створен са неколико претходних заставица ОР-инг-ом, било путем О_РДОНЛИ или О_РДВР. Описани параметри указују на то да његов објект заједничке меморије мора бити формиран (О_ЦРЕАТ) када већ не постоји, а такође је објекат доступан за читање и писање (О_РДВР). Посљедњи аргумент поставља одобрења директорија за објект дијељене меморије.

схм_унлинк ()

Схм_унлинк () елиминише ПОСИКС заједничку меморију која је раније била развијена. Дескриптор целобројног документа за објект дељене меморије враћа се ефективним позивом на схм_опен (). Као што је дефинисано испод схм_опен (), име параметра је наслов ентитета заједничке меморије. Следи дефиниција схм_унлинк () функција:

>> Инт схм_унлинк (цонст цхар * име);

фтрунцате ()

По постављању објекта, фтрунцате () метода се одбацује да би се поставила величина ентитета у бајтовима. Дефиниција функције је следећа:

>> Инт фтрунцате (инт фд, дужина_т_т);

Када се конструише заједничка ПОСИКС меморија, она заиста износи нула бајтова. Можете да прикажете ПОСИКС ентитет дељене меморије са бајтовима величине дужине путем фтрунцате. Фтрунцате даје нула на извршењу. Фтрунцате излази -1 у случају квара и еррно је подешен да покреће грешку.

ммап ()

На крају се путем мапе поставља документ мапиран у меморију са ентитетом дељене меморије ммап () метода. Затим даје меморирани мапирани показивач документа који се одбацује да би се достигао ентитет дељене меморије. Следи дефиниција ммап () функција:

>> Воид * ммап (воид * аддр, сизе_т ленгтх, инт прот, инт флагс, инт фд, офф_т оффсет);

У овоме је „адреса“ адреса на коју ће бити мапиран. „Дужина“ је опсег ентитета заједничке меморије. Вредности за прот могу се разликовати, али ми ћемо користити ПРОТ РЕАД | ПРОТ ВРИТЕ. Постоји неколико заставица, али МАП СХАРЕД је пресудан за заједничку меморију. Сада је 'фд' дескриптор документа који је добијен раније. Помак је тачка у којој мапирање започиње у ентитету заједничке меморије; може се користити и вредност померања 0. На крају, ммап () даје показивач на положај мапирања ентитета заједничке меморије.

мунмап ()

На позицији коју је усмерио аддр и добијању величине, дужине, мунмап распакује ставку заједничке меморије. Мунмап даје 0 по завршетку и -1 у случају нетачности, у том случају је додељено еррно за покретање грешке.

>> Воид мунмап (воид * аддр, сизе_т ленгтх);

Пример: Пошиљалац и прималац

Узмимо пример пошиљаоца и примаоца. Пошиљалац ће створити нови објект заједничке меморије са именом / схмем-пример и преко њега упишите три броја у заједничку меморију. Сада пријемник може да изложи објекат заједничке меморије и изговори три броја из меморије. Направићемо три датотеке са именима протокол.х, пошиљаоцу.ц, и пријемник.ц.

$ тоуцх протокол.х
$ тоуцх пошиљалац.ц
$ тоуцх пријемник.ц

Даље, додаћемо доњи изворни код протоколу датотека.х, "пошиљалац.ц, 'и' пријемник.ц.'Сада ћемо спасити све и затворити их.

Сада ћемо компајлирати и придружити горњи код користећи кључну реч -лрт одвојено за пошиљаоца.ц и пријемник.ц датотека. Ево наредбе за то:

$ гцц -о пошиљалац пошиљаоца.ц -лрт
$ гцц -о пријемник пријемника.ц -лрт

Сада ћемо покренути код пошиљаоца помоћу следеће наредбе. Излаз је дат у наставку.

$ ./ пошиљалац

Извођењем кода пошиљаоца генерисан је објект заједничке меморије који се може наћи испод / дев / схм користећи наредбу испод:

$ лс -л / дев / схм | греп схмем-пример

Када покренемо код пријемника, добићемо излаз испод:

$ ./ пријемник

Кад год функција гм_унлинк () се позива помоћу датотеке 'пријемник.ц, 'објект / дев / схм / схмем-пример биће одвојена. У овом случају нећете добити објекат на излазу, као што је приказано доле.

$ лс -л / дев / схм / схмем-пример

Закључак

У овом чланку сте научили како да користите ПОСИКС дељену меморију са Ц програмирањем у Убунту 20.04, укључујући сваки позив функције који се користи за успостављање заједничке меморије. Надам се да вам је овај чланак помогао да побољшате своје знање програмирања и обухватио сваку сумњу у вези са овом темом.

ОпенТТД вс Симутранс
Стварање сопствене симулације превоза може бити забавно, опуштајуће и изузетно примамљиво. Због тога морате да испробате што више игара како бисте про...
Водич за ОпенТТД
ОпенТТД је једна од најпопуларнијих игара за пословну симулацију. У овој игри морате створити диван посао превоза. Међутим, почет ћете у почетку око 1...
СуперТукКарт за Линук
СуперТукКарт је сјајан наслов дизајниран да вам пружи Марио Карт искуство бесплатно на вашем Линук систему. Прилично је изазовно и забавно играти, диз...