Panggilan Memori Bersama POSIX
Fungsi memori bersama POSIX berfokus pada konsep UNIX bahwa objek harus berupa dokumen saat melakukan aktivitas input/output pada entitas. Oleh karena itu, karena Anda membaca dan menuliskan ke entitas memori POSIX bersama, yang terakhir harus dianggap sebagai dokumen as. Dokumen yang dipetakan memori adalah entitas memori bersama POSIX. Untuk menggunakan shm_open fungsi panggilan sistem di bawah /dev/shm, dokumen memori bersama yang terpisah dihasilkan. Hanya ada dua panggilan sistem memori bersama khusus dari POSIX, shm_open, dan sm_unlink, yang terkait erat dengan membuka dan memutuskan tautan panggilan sistem file. Itu fruncate, mmap, dan munmap panggilan kerangka kerja untuk dokumen digunakan untuk melakukan tugas lain pada memori bersama POSIX. Penting untuk menghubungkan program yang menggunakan panggilan memori bersama POSIX ke -lrt.
Program yang menggunakan panggilan memori bersama POSIX harus melalui langkah-langkah berikut:
Menggunakan shm_buka(), membentuk objek memori bersama. Deskriptor dokumen dapat dikembalikan jika pembentukan objek berhasil.
Dengan putuskan (), ukuran objek akan tetap.
Dengan peta() dan MAP_SHARED, gambarkan objek ini ke dalam ruang alamat saat ini.
Baca/tulis memori bersama.
Melalui munmap(), hapus batas memori bersama.
Menggunakan Menutup() untuk menutup objek.
Melalui shm_unlink(), hapus objek di memori bersama.
shm_buka()
Seperti yang dijelaskan di atas, shm_buka() digunakan untuk menghasilkan objek memori bersama yang baru. Itu membuat objek dapat diakses oleh prosedur panggilan menggunakan deskriptor yang dikembalikan. Berikut ini adalah definisi dari pemanggilan fungsi ini:
>> Int shm_open( const char *nama, int oflag, mode_t mode);Parameter pertama adalah nama objek memori bersama. Ini adalah string yang diakhiri null dari /nama ketik, dengan ketentuan tidak boleh ada karakter lain yang menjadi garis miring selain karakter pertamanya. Oflag adalah selubung kecil yang dibuat dengan beberapa bendera sebelumnya dengan OR-ing, baik melalui O_RDONLY atau O_RDWR. Parameter yang dijelaskan menunjukkan bahwa objek shared-memory harus dibentuk (O_CREAT) ketika belum ada dan juga objek tersedia untuk membaca dan menulis (O_RDWR). Argumen terakhir menetapkan persetujuan direktori untuk objek memori bersama.
shm_unlink()
Shm_unlink() menghilangkan entitas memori bersama POSIX yang sebelumnya dikembangkan. Deskriptor dokumen integer untuk objek memori bersama dikembalikan melalui panggilan efektif ke shm_buka(). Seperti yang didefinisikan di bawah shm_buka(), nama parameter adalah judul entitas memori bersama. Berikut ini adalah pengertian dari shm_unlink() fungsi:
>> Int shm_unlink( const char *nama);putuskan ()
Setelah mengatur objek, putuskan () metode dibuang untuk mengatur ukuran entitas dalam byte. Definisi fungsi adalah sebagai berikut:
>> Int ftruncate( int fd, panjang off_t);Saat membangun memori POSIX bersama, itu memang kapasitas ukuran nol byte. Anda dapat merender entitas memori bersama POSIX dengan panjang ukuran byte melalui mengalah. Memotong menghasilkan nol pada eksekusi. Memotong output -1 jika terjadi kegagalan dan salah diatur untuk memicu kesalahan.
mmap()
Akhirnya, dokumen yang dipetakan memori dengan entitas memori bersama diatur melalui mmap() metode. Kemudian, itu menghasilkan penunjuk dokumen yang dipetakan memori yang dibuang untuk mencapai entitas memori bersama. Berikut ini adalah pengertian dari mmap() fungsi:
>> Void *mmap ( void *addr, size_t length, int prot, int flags, int fd, off_t offset);Dalam hal ini, 'addr' adalah alamat yang akan dipetakan. 'Panjang' adalah rentang entitas memori bersama. Nilai untuk prot mungkin berbeda, tetapi kami akan menggunakan PROT READ | PENULISAN PROT. Ada beberapa tanda, tetapi MAP SHARED sangat penting untuk memori bersama. Sekarang, 'fd' adalah deskriptor dokumen yang diperoleh sebelumnya. Offset adalah titik di mana pemetaan dimulai di entitas memori bersama; nilai offset 0 juga dapat digunakan. Dalam penyelesaian, mmap() menghasilkan penunjuk ke posisi pemetaan entitas memori bersama.
munmap()
Pada posisi yang diarahkan oleh addr dan mendapatkan ukuran, panjang, munmap membuka peta item memori bersama. Munmap menghasilkan 0 setelah selesai dan -1 dalam situasi ketidakakuratan, dalam hal ini errno ditetapkan untuk memicu kesalahan.
>> Void munmap ( void *addr, size_t length);Contoh: Pengirim dan Penerima
Mari kita ambil contoh pengirim dan penerima. Pengirim akan membuat objek memori bersama baru dengan nama /shmem-contoh dan tuliskan tiga angka ke dalam memori bersama melaluinya. Sekarang, penerima dapat mengekspos objek memori bersama dan membacakan tiga angka dari memori. Kami akan membuat tiga file dengan nama protokol.h, pengirim.c, dan penerima.c.
$protokol sentuh.h$ pengirim sentuh.c
$ penerima sentuh.c
Selanjutnya, kita akan menambahkan kode sumber di bawah ini ke file 'protokol.h,"pengirim.c,' dan 'penerima.c.' Sekarang, kita akan menyimpan semua dan menutupnya.
Sekarang kita akan mengkompilasi dan menggabungkan kode di atas menggunakan kata kunci -lrt secara terpisah untuk pengirim.c dan penerima.file c. Berikut adalah perintah untuk melakukannya:
$ gcc -o pengirim pengirim.c -lrt$ gcc -o penerima penerima.c -lrt
Sekarang, kita akan menjalankan kode pengirim menggunakan perintah berikut:. Outputnya diberikan di bawah ini.
$ ./pengirim
Menjalankan kode pengirim, objek memori bersama telah dibuat dan dapat ditemukan di bawah /dev/shm menggunakan perintah di bawah ini:
$ ls -l /dev/shm | grep shmem-contoh
Ketika kita menjalankan kode penerima, kita akan mendapatkan output di bawah ini:
$ ./penerima
Kapanpun fungsinya gm_unlink() dipanggil menggunakan file 'receiver.c,' objeknya /dev/shm/shmem-contoh akan terlepas. Dalam hal ini, Anda tidak akan mendapatkan objek pada output, seperti yang ditunjukkan di bawah ini.
$ ls -l /dev/shm/shmem-example
Kesimpulan
Pada artikel ini, Anda mempelajari cara menggunakan POSIX Shared Memory dengan pemrograman C di Ubuntu 20.04, termasuk setiap panggilan fungsi yang digunakan untuk membangun memori bersama. Saya harap artikel ini membantu Anda untuk meningkatkan pengetahuan pemrograman Anda dan menutupi setiap keraguan yang Anda miliki tentang hal ini.