Berkas Tajuk:
#termasukSintaksis:
void * mmap (void *address, size_t length, int protect, int flags, int filedes,off_t offset)
Argumen:
Fungsi ini membutuhkan 6 argumen:
1. alamat:
Argumen ini memberikan alamat awal yang disukai untuk pemetaan. Jika pemetaan lain tidak ada di sana, maka kernel akan memilih batas halaman terdekat dan membuat pemetaan; jika tidak, kernel akan memilih alamat baru. Jika argumen ini NULL, maka kernel dapat menempatkan pemetaan di mana saja yang dianggap cocok.
2. panjangnya:
Ini adalah jumlah byte yang akan dipetakan.
3. melindungi:
Argumen ini digunakan untuk mengontrol jenis akses apa yang diizinkan. Argumen ini mungkin logis 'ATAU' dari flag berikut PROT_BACA | PROT_MENULIS | PROT_EXEC | PROT_NONE. Jenis akses baca, tulis, dan eksekusi adalah izin pada konten.
4. bendera:
Argumen ini digunakan untuk mengontrol sifat peta. Berikut adalah beberapa nilai umum dari flag:
- MAP_SHARED: Bendera ini digunakan untuk berbagi pemetaan dengan semua proses lain, yang dipetakan ke objek ini. Perubahan yang dilakukan pada wilayah pemetaan akan ditulis kembali ke file.
- MAP_PRIVATE: Saat flag ini digunakan, pemetaan tidak akan terlihat oleh proses lain, dan perubahan yang dibuat tidak akan ditulis ke file.
- MAP_ANONYMOUS / MAP_ANON: Bendera ini digunakan untuk membuat pemetaan anonim. Pemetaan anonim berarti pemetaan tidak terhubung ke file apa pun. Pemetaan ini digunakan sebagai primitif dasar untuk memperluas heap.
- MAP_FIXED: Ketika bendera ini digunakan, sistem harus dipaksa untuk menggunakan alamat pemetaan yang tepat yang ditentukan dalam alamat Jika ini tidak memungkinkan, maka pemetaan akan gagal.
5. filedes:
Ini adalah deskriptor file yang harus dipetakan.
6. mengimbangi:
Ini diimbangi dari tempat pemetaan file dimulai. Secara sederhana, pemetaan terhubung ke (mengimbangi) untuk (offset+panjang-1) byte untuk file terbuka pada filedes deskriptor.
Nilai kembali:
Pada kesuksesan, mmap() mengembalikan 0; untuk kegagalan, fungsi mengembalikan MAP_FAILED.
Secara piktorial, kita dapat merepresentasikan fungsi peta sebagai berikut:
Untuk membuka peta wilayah yang dipetakan munmap() fungsi yang digunakan:
Sintaksis:
int munmap(kosong *alamat, ukuran_t panjangnya);
Nilai kembali:
Pada kesuksesan, munmap() mengembalikan 0; untuk kegagalan, fungsi mengembalikan -1.
Contoh:
Sekarang kita akan melihat contoh program untuk masing-masing berikut menggunakan panggilan sistem mmap():
- Alokasi memori (Contoh1.c)
- Membaca file (Contoh2.c)
- Menulis file (Contoh3.c)
- Komunikasi antarproses (Contoh4.c)
Contoh 1.c
#termasuk#termasuk
int utama()
int N=5; // Jumlah elemen untuk array
int *ptr = mmap ( NULL, N*ukuran(int),
PROT_BACA | PROT_MENULIS,
MAP_PRIVATE | MAP_ANONYMOUS,
0, 0 );
jika(ptr == MAP_FAILED)
printf("Pemetaan Gagal\n");
kembali 1;
// Isi elemen array
untuk(int i=0; i ");
untuk(int i=0; i
printf("\n");
int err = munmap(ptr, 10*sizeof(int));
jika (err != 0)
printf("Gagal Membuka Pemetaan\n");
kembali 1;
kembali 0;
Dalam Contoh1.c kita mengalokasikan memori menggunakan mmap. Di sini kami menggunakan PROT_READ | Proteksi PROT_WRITE untuk membaca dan menulis ke wilayah yang dipetakan. Kami menggunakan MAP_PRIVATE | Bendera MAP_ANONYMOUS. MAP_PRIVATE digunakan karena wilayah pemetaan tidak dibagikan dengan proses lain, dan MAP_ANONYMOUS digunakan karena di sini, kami belum memetakan file apa pun. Untuk alasan yang sama, deskriptor file dan mengimbangi nilai diatur ke 0.
Contoh2.c
#termasuk#termasuk
#termasuk
#termasuk
#termasuk
#termasuk
int main(int argc, char *argv[])
jika (argc < 2)
printf("Jalur file tidak disebutkan\n");
keluar(0);
const char *filepath = argv[1];
int fd = buka(jalur berkas, O_RDONLY);
jika (fd < 0)
printf("\n\"%s \"" tidak dapat dibuka\n"",
jalur file)