Датотека заглавља:
#инцлудеСинтакса:
воид * ммап (воид * адреса, величина_т дужина, инт заштита, инт заставе, инт датотеке,офф_т оффсет)
Аргументи:
Функција узима 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)
принтф ("\ н \"% с \ ""се не може отворити \ н"",
филепатх)