Pemrograman C

Cara menggunakan fungsi mmap dalam bahasa C?

Cara menggunakan fungsi mmap dalam bahasa C?
Itu mmap() fungsi digunakan untuk pemetaan antara ruang alamat proses dan file atau perangkat. Ketika file dipetakan ke ruang alamat proses, file tersebut dapat diakses seperti array dalam program. Ini adalah salah satu cara paling efisien untuk mengakses data dalam file dan menyediakan antarmuka pengkodean mulus yang alami untuk struktur data yang dapat dinilai tanpa abstraksi membaca dan menulis dari file. Pada artikel ini, kita akan membahas cara menggunakan mmap() fungsi di Linux. Jadi, mari kita mulai.

Berkas Tajuk:

#termasuk

Sintaksis:

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; iprintf("[%d] ",ptr[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)
Kontrol & kelola gerakan mouse di antara beberapa monitor di Windows 10
Manajer Mouse Tampilan Ganda memungkinkan Anda mengontrol & mengonfigurasi gerakan mouse di antara beberapa monitor, dengan memperlambat gerakannya di...
WinMouse memungkinkan Anda menyesuaikan & meningkatkan gerakan penunjuk tetikus di PC Windows
Jika Anda ingin meningkatkan fungsi default penunjuk tetikus Anda, gunakan freeware WinMouse. Ini menambahkan lebih banyak fitur untuk membantu Anda m...
Tombol klik kiri mouse tidak berfungsi pada Windows 10
Jika Anda menggunakan mouse khusus dengan laptop, atau komputer desktop, tetapi but tombol klik kiri mouse tidak berfungsi pada Windows 10/8/7 untuk b...