Fail Tajuk:
#sertakanSintaks:
batal * mmap (alamat tidak sah *, ukuran size_t, perlindungan int, bendera int, int files,off_t mengimbangi)
Hujah:
Fungsi ini mengambil 6 argumen:
1. alamat:
Argumen ini memberikan alamat permulaan yang disukai untuk pemetaan. Sekiranya pemetaan lain tidak ada di sana, maka kernel akan memilih sempadan halaman yang berdekatan dan membuat pemetaan; jika tidak, kernel memilih alamat baru. Sekiranya argumen ini NULL, maka kernel dapat meletakkan pemetaan di mana sahaja yang difikirkan sesuai.
2. panjang:
Ini adalah bilangan bait yang akan dipetakan.
3. melindungi:
Hujah ini digunakan untuk mengawal jenis akses yang dibenarkan. Hujah ini mungkin logik 'ATAU' dari bendera berikut PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE. Jenis akses membaca, menulis dan melaksanakan adalah kebenaran pada kandungan.
4. bendera:
Hujah ini digunakan untuk mengawal sifat peta. Berikut adalah beberapa nilai umum bendera:
- PETA_DAHULU: Bendera ini digunakan untuk berbagi pemetaan dengan semua proses lain, yang dipetakan ke objek ini. Perubahan yang dibuat ke wilayah pemetaan akan ditulis kembali ke fail.
- PETA_PRIVATE: Apabila bendera ini digunakan, pemetaan tidak akan dilihat oleh proses lain, dan perubahan yang dibuat tidak akan ditulis ke fail.
- PETA_ANONYMOUS / PETA_ANON: Bendera ini digunakan untuk membuat pemetaan tanpa nama. Pemetaan tanpa nama bermaksud pemetaan tidak disambungkan ke sebarang fail. Pemetaan ini digunakan sebagai primitif asas untuk memperluas timbunan.
- PETA_FIXED: Ketika bendera ini digunakan, sistem harus dipaksa untuk menggunakan alamat pemetaan tepat yang ditentukan dalam alamat Sekiranya ini tidak dapat dilakukan, maka pemetaan akan gagal.
5. difailkan:
Ini adalah deskriptor fail yang harus dipetakan.
6. mengimbangi:
Ini diimbangi dari mula pemetaan fail. Secara ringkas, pemetaan menghubungkan dengan (mengimbangi) ke (mengimbangi + panjang-1) bait untuk fail dibuka difailkan penerangan.
Nilai pulangan:
Pada kejayaan, yang mmap () mengembalikan 0; kerana kegagalan, fungsi mengembalikan MAP_FAILED.
Secara bergambar, kita dapat menggambarkan fungsi peta seperti berikut:
Untuk memetakan kawasan yang dipetakan munmap () fungsi digunakan:
Sintaks:
int munmap(terbatal *alamat, saiz_t panjang);
Nilai pulangan:
Pada kejayaan, yang munmap () mengembalikan 0; untuk kegagalan, fungsi kembali -1.
Contoh:
Sekarang kita akan melihat contoh program untuk setiap berikut menggunakan panggilan sistem mmap ():
- Peruntukan memori (Contoh1.c)
- Membaca fail (Contoh2.c)
- Fail penulisan (Contoh3.c)
- Komunikasi antara proses (Contoh4.c)
Contoh1.c
#sertakan#sertakan
int utama ()
int N = 5; // Bilangan elemen untuk tatasusunan
int * ptr = mmap (NULL, N * sizeof (int),
PROT_READ | PROT_WRITE,
PETA_PRIVATE | PETA_ANONYMOUS,
0, 0);
jika (ptr == MAP_FAILED)
printf ("Pemetaan Gagal \ n");
pulangan 1;
// Isi unsur larik
untuk (int i = 0; i ");
untuk (int i = 0; i
printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
sekiranya (keliru != 0)
printf ("Pemetaan Tidak Gagal \ n");
pulangan 1;
pulangan 0;
Dalam Contoh1.c kita memperuntukkan memori menggunakan mmap. Di sini kami menggunakan PROT_READ | PROT_WRITE perlindungan untuk membaca dan menulis ke wilayah yang dipetakan. Kami menggunakan MAP_PRIVATE | Bendera MAP_ANONYMOUS. MAP_PRIVATE digunakan kerana wilayah pemetaan tidak dibagi dengan proses lain, dan MAP_ANONYMOUS digunakan kerana di sini, kami belum memetakan fail apa pun. Atas sebab yang sama, penerangan fail dan juga mengimbangi nilai ditetapkan ke 0.
Contoh2.c
#sertakan#sertakan
#sertakan
#sertakan
#sertakan
#sertakan
int main (int argc, char * argv [])
sekiranya (argc < 2)
printf ("Laluan fail tidak disebutkan \ n");
jalan keluar (0);
const char * filepath = argv [1];
int fd = terbuka (jalan masuk, O_RDONLY);
sekiranya (fd < 0)
printf ("\ n \"% s \ ""tidak dapat dibuka \ n"",
jalan masuk)