Pengaturcaraan C

Cara menggunakan fungsi mmap dalam bahasa C?

Cara menggunakan fungsi mmap dalam bahasa C?
The mmap () fungsi digunakan untuk pemetaan antara ruang alamat proses dan sama ada fail atau peranti. Ketika file dipetakan ke ruang alamat proses, file dapat diakses seperti array dalam program. Ini adalah salah satu cara yang paling berkesan untuk mengakses data dalam fail dan menyediakan antara muka pengekodan yang lancar yang wajar untuk struktur data yang dapat dinilai tanpa dia abstrak membaca dan menulis dari fail. Dalam artikel ini, kita akan membincangkan cara menggunakan mmap () berfungsi dalam Linux. Oleh itu, mari kita mulakan.

Fail Tajuk:

#sertakan

Sintaks:

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; iprintf ("[% d]", ptr [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)
Tutorial Battle for Wesnoth
The Battle for Wesnoth adalah salah satu permainan strategi sumber terbuka paling popular yang boleh anda mainkan pada masa ini. Bukan hanya permainan...
0 A.D. Tutorial
Daripada banyak permainan strategi di luar sana, 0 A.D. berjaya menonjol sebagai tajuk yang komprehensif dan permainan taktikal yang sangat mendalam w...
Tutorial Unity3D
Pengenalan Unity 3D Unity 3D adalah enjin pengembangan permainan yang kuat. Ini adalah platform silang yang memungkinkan anda membuat permainan untuk ...