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

Како се користи функција ммап у језику Ц?

Како се користи функција ммап у језику Ц?
Тхе ммап () функција се користи за мапирање између адресног простора процеса и датотека или уређаја. Када се датотека преслика у адресни простор процеса, датотеци се може приступити као низ у програму. Ово је један од најефикаснијих начина за приступ подацима у датотеци и пружа беспрекоран интерфејс за кодирање који је природан за структуру података која се може проценити без апстракције читања и писања из датотека. У овом чланку ћемо разговарати о томе како се користи ммап () функција у Линуку. Па, кренимо.

Датотека заглавља:

#инцлуде

Синтакса:

воид * ммап (воид * адреса, величина_т дужина, инт заштита, инт заставе, инт датотеке,
офф_т оффсет)

Аргументи:

Функција узима 6 аргумената:

1. адреса:

Овај аргумент даје жељену почетну адресу за мапирање. Ако друго мапирање тамо не постоји, тада ће језгро одабрати оближњу границу странице и створити мапирање; у супротном, кернел бира нову адресу. Ако је овај аргумент НУЛЛ, тада језгро може смјестити мапирање било гдје гдје му одговара.

2. дужина:

Ово је број бајтова за мапирање.

3. заштитити:

Овај аргумент се користи за контролу врсте приступа која је дозвољена. Овај аргумент може бити логичан „ИЛИ“ следећих заставица ПРОТ_РЕАД | ПРОТ_ВРИТЕ | ПРОТ_ЕКСЕЦ | ПРОТ_НОНЕ.  Врсте приступа за читање, писање и извршавање су дозволе за садржај.

4. заставе:

Овај аргумент се користи за контролу природе мапе. Следе неке уобичајене вредности застава:

  • МАП_СХАРЕД: Ова застава се користи за дељење мапирања са свим осталим процесима који су мапирани на овај објекат. Промене направљене у регији мапирања биће враћене у датотеку.
  • МАП_ПРИВАТЕ: Када се користи ова заставица, пресликавање неће видети ниједан други процес, а извршене промене неће бити записане у датотеку.
  • МАП_АНОНИМОУС / МАП_АНОН: Ова застава се користи за креирање анонимног мапирања. Анонимно мапирање значи да мапирање није повезано ни са једном датотеком. Ово мапирање се користи као основни примитив за проширење гомиле.
  • МАП_ФИКСЕД: Када се користи ова заставица, систем мора бити приморан да користи тачну адресу мапирања наведену у адреса Ако то није могуће, тада мапирање неће успјети.

5. поља:

Ово је дескриптор датотеке који се мора мапирати.

6. офсет:

Ово се одмиче од места где је започето мапирање датотека. Једноставно речено, мапирање се повезује са (офсет) до (офсет + дужина-1) бајтова за датотеку отворену на поља дескриптор.

Повратне вредности:

О успеху, ммап () враћа 0; у случају неуспјеха, функција враћа МАП_ФАИЛЕД.

Сликовито можемо приказати функцију карте на следећи начин:

За мапирање мапиране регије мунмап () функција се користи:

Синтакса:

инт мунмап(празнина *адреса, сизе_т дужина);

Повратне вредности:

О успеху, мунмап () враћа 0; у случају неуспеха, функција враћа -1.

Примери:

Сада ћемо видети пример програма за сваки од следећих помоћу системског позива ммап ():

  • Додела меморије (Пример1.ц)
  • Датотека за читање (Пример2.ц)
  • Датотека за писање (Пример3.ц)
  • Међупроцесна комуникација (Пример4.ц)

Пример1.ц

#инцлуде
#инцлуде
инт маин ()
инт Н = 5; // Број елемената за низ
инт * птр = ммап (НУЛЛ, Н * величина (инт),
ПРОТ_РЕАД | ПРОТ_ВРИТЕ,
МАП_ПРИВАТЕ | МАП_АНОНИМОУС,
0, 0);
иф (птр == МАП_ФАИЛЕД)
принтф ("Мапирање није успело \ н");
ретурн 1;

// Попуњавање елемената низа
за (инт и = 0; и ");
за (инт и = 0; ипринтф ("[% д]", птр [и]);

принтф ("\ н");
инт ерр = мунмап (птр, 10 * сизеоф (инт));
ако (грешка != 0)
принтф ("Отказивање мапирања није успело \ н");
ретурн 1;

ретурн 0;

У Примеру1.ц алоцирамо меморију помоћу ммап-а. Овде смо користили ПРОТ_РЕАД | ПРОТ_ВРИТЕ заштита за читање и писање у мапирану регију. Користили смо МАП_ПРИВАТЕ | МАП_АНОНИМОУС застава. МАП_ПРИВАТЕ се користи јер се регија мапирања не дели са другим процесима, а користи се МАП_АНОНИМОУС јер овде нисмо мапирали ниједну датотеку. Из истог разлога, дескриптор датотеке и офсет вредност је постављена на 0.

Пример2.ц

#инцлуде
#инцлуде
#инцлуде
#инцлуде
#инцлуде
#инцлуде
инт маин (инт аргц, цхар * аргв [])
ако (аргц < 2)
принтф ("Путања датотеке није поменута \ н");
излаз (0);

цонст цхар * филепатх = аргв [1];
инт фд = отворен (пут до датотеке, О_РДОНЛИ);
ако (фд < 0)
принтф ("\ н \"% с \ ""се не може отворити \ н"",
филепатх)
Најбољи лаптоп за дизајн ентеријера
Без обзира да ли сте студент дизајна ентеријера, професионални дизајнер ентеријера или желите да се из забаве бавите неким дизајном ентеријера, требаћ...
Најбољи преносни рачунари за стримовање видео записа
Када тражите нови лаптоп, то може бити заиста поразно, јер данас постоји толико много опција. Добар продавац рачунара увек ће вас питати шта мислите ...
Најбољи лаптоп за студенте архитектуре
Архитектура остаје један од најконкурентнијих курсева на колеџу, али подразумијева се да се куповина ресурса може збрајати и постати изузетно скупа. М...