Pemrograman C

Memori Bersama POSIX dengan Pemrograman C

Memori Bersama POSIX dengan Pemrograman C
Memori bersama POSIX adalah kerangka kerja untuk komunikasi antar-proses (IPC) yang ditentukan dalam spesifikasi POSIX. Dua (atau lebih) tugas dapat membaca darinya dan menulis ke zona memori bersama sambil membangun memori bersama. Memori bersama POSIX tidak selalu memaksakan pengeluaran salinan, berbeda dengan struktur IPC lainnya (mis.g., pipa, soket, dll.), dan diinginkan untuk program tertentu.

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.

Tombol tengah mouse tidak berfungsi di Windows 10
Itu tombol tengah mouse membantu Anda menelusuri halaman web dan layar yang panjang dengan banyak data. Jika itu berhenti, Anda akhirnya akan mengguna...
Cara Mengganti Tombol Kiri & Kanan Mouse di PC Windows 10
Sudah menjadi hal biasa bahwa semua perangkat mouse komputer dirancang secara ergonomis untuk pengguna yang tidak kidal. Tetapi ada perangkat mouse ya...
Tiru klik Mouse dengan mengarahkan mouse menggunakan Clickless Mouse di Windows 10
Menggunakan mouse atau keyboard dalam posisi yang salah dari penggunaan yang berlebihan dapat menyebabkan banyak masalah kesehatan, termasuk keteganga...