Pengaturcaraan C

Memori Berkongsi POSIX dengan Pengaturcaraan C

Memori Berkongsi POSIX dengan Pengaturcaraan C
Memori bersama POSIX adalah kerangka untuk komunikasi antara proses (IPC) yang ditentukan dalam spesifikasi POSIX. Dua (atau lebih) tugas dapat membaca daripadanya dan menulis ke zon memori bersama sambil mewujudkan memori bersama. Memori bersama POSIX tidak selalu melaksanakan pengeluaran salinan, berbeza dengan struktur IPC lain (e.g., paip, soket, dll., dan sangat diharapkan untuk program tertentu.

Panggilan Memori Berkongsi POSIX

Fungsi memori bersama POSIX tertumpu pada konsep UNIX bahawa objek mesti menjadi dokumen ketika melakukan aktiviti input / output pada entiti. Oleh itu, kerana anda membaca dan menulis ke entiti memori POSIX bersama, yang terakhir mesti dianggap sebagai dokumen. Dokumen yang dipetakan memori adalah entiti memori bersama POSIX. Untuk menggunakan shm_open fungsi panggilan sistem di bawahnya / dev / shm, dokumen memori bersama yang terpisah dihasilkan. Hanya ada dua panggilan sistem memori bersama yang dikhaskan dari POSIX, shm_open, dan shm_unlink, yang berkait rapat dengan membuka dan memutuskan sambungan sistem fail. The ftruncate, mmap, dan munmap panggilan kerangka untuk dokumen digunakan untuk melakukan tugas lain pada memori bersama POSIX. Anda perlu menyambungkan program yang menggunakan panggilan memori bersama POSIX -lrt.

Program yang menggunakan panggilan memori bersama POSIX mesti melalui langkah-langkah berikut:

Menggunakan shm_open (), membentuk objek memori bersama. Penerangan dokumen dapat dikembalikan sekiranya pembentukan objek berjaya.

Dengan ftruncate (), ukuran objek akan diperbaiki.

Dengan peta () dan PETA_HAMPIR, gariskan objek ini ke ruang alamat sekarang.

Baca / tulis memori bersama.

Melalui munmap (), nyah menggambarkan memori bersama.

Gunakan tutup () untuk menutup objek.

Melalui shm_unlink (), padamkan objek dalam memori bersama.

shm_open ()

Seperti yang dijelaskan di atas, shm_open () digunakan untuk menghasilkan objek memori bersama baru. Ia menjadikan objek dapat diakses ke prosedur panggilan menggunakan deskriptor terbalik. Berikut adalah definisi panggilan fungsi ini:

>> Int shm_open (const char * name, int oflag, mode_t mode);

Parameter pertama adalah nama objek memori bersama. Ini adalah rentetan nol yang diakhiri / nama taipkan, dengan ketentuan bahawa tidak ada watak lain yang boleh menjadi garis miring selain watak pertama. Oflag adalah kerudung kecil yang dibuat dengan beberapa bendera sebelumnya oleh OR-ing, sama ada melalui O_RDONLY atau O_RDWR. Parameter yang dijelaskan menunjukkan bahawa objek memori bersama mesti dibentuk (O_CREAT) ketika ia belum ada dan juga objek itu tersedia untuk membaca dan menulis (O_RDWR). Argumen terakhir menetapkan kelulusan direktori untuk objek memori bersama.

shm_unlink ()

Shm_unlink () menghilangkan entiti memori bersama POSIX yang sebelumnya dikembangkan. Penjelasan dokumen integer untuk objek memori bersama dikembalikan melalui panggilan berkesan ke shm_open (). Seperti yang ditakrifkan di bawah shm_open (), nama parameter adalah tajuk entiti memori bersama. Berikut adalah definisi bagi shm_unlink () fungsi:

>> Int shm_unlink (const char * name);

ftruncate ()

Setelah menetapkan objek, ftruncate () kaedah dibuang untuk menetapkan ukuran entiti dalam bait. Definisi fungsi adalah seperti berikut:

>> Int ftruncate (int fd, off_t panjang);

Semasa membina memori POSIX yang dikongsi, ia adalah kapasiti sifar byte saiz. Anda boleh menjadikan entiti memori bersama POSIX dengan byte ukuran panjang melalui ftruncate. Ftruncate menghasilkan sifar semasa pelaksanaan. Ftruncate output -1 sekiranya berlaku kegagalan dan errno ditetapkan untuk mencetuskan ralat.

mmap ()

Akhirnya, dokumen yang dipetakan memori dengan entiti memori bersama ditetapkan melalui mmap () kaedah. Kemudian, ia menghasilkan penunjuk dokumen yang dipetakan memori yang dikeluarkan untuk mencapai entiti memori bersama. Berikut adalah definisi bagi mmap () fungsi:

>> Void * mmap (void * addr, size_t length, int prot, int flags, int fd, off_t offset);

Dalam ini, 'addr' adalah alamat yang akan dipetakan. 'Panjang' adalah julat entiti memori bersama. Nilai untuk prot mungkin berbeza, tetapi kami akan menggunakan PROT READ | PROT MENULIS. Terdapat beberapa bendera, tetapi PETA DIKONGSI penting untuk memori bersama. Sekarang, 'fd' adalah deskriptor dokumen yang diperoleh sebelumnya. Offset adalah titik di mana pemetaan bermula dalam entiti memori bersama; nilai 0 ofset juga boleh digunakan. Setelah selesai, mmap () menghasilkan penunjuk ke kedudukan pemetaan entiti memori bersama.

munmap ()

Pada kedudukan yang diarahkan oleh addr dan mendapatkan ukuran, panjang, munmap buka peta item memori bersama. Munmap menghasilkan 0 setelah selesai dan -1 dalam keadaan ketidaktepatan, dalam hal ini errno ditugaskan untuk mencetuskan ralat.

>> Void munmap (void * addr, size_t length);

Contoh: Penghantar dan Penerima

Mari kita ambil contoh pengirim dan penerima. Pengirim akan membuat objek memori bersama baru dengan nama / shmem-contoh dan masukkan tiga nombor ke dalam memori bersama melaluinya. Sekarang, penerima boleh memaparkan objek memori bersama dan membacakan tiga angka dari memori. Kami akan membuat tiga fail dengan nama protokol.h, penghantar.c, dan penerima.c.

protokol $ sentuh.h
$ sentuh penghantar.c
penerima $ sentuh.c

Seterusnya, kami akan menambahkan kod sumber di bawah ke protokol fail.h, "pengirim.penerima c, 'dan'.c.'Sekarang, kita akan menyelamatkan semua dan menutupnya.

Sekarang kita akan menyusun dan menggabungkan kod di atas menggunakan kata kunci -lrt secara berasingan untuk pengirim.c dan penerima.fail c. Berikut adalah arahan untuk melakukannya:

pengirim $ gcc -o.c -lrt
Penerima $ gcc -o.c -lrt

Sekarang, kami akan menjalankan kod pengirim menggunakan perintah berikut. Keluaran diberikan di bawah.

$ ./ penghantar

Menjalankan kod pengirim, objek memori bersama telah dihasilkan dan dapat dijumpai di bawahnya / dev / shm menggunakan arahan di bawah:

$ ls -l / dev / shm | grep shmem-contoh

Apabila kita menjalankan kod penerima, kita akan memperoleh output di bawah:

$ ./ penerima

Bila-bila masa majlis gm_unlink () dipanggil menggunakan penerima fail.c, 'objek itu / dev / shm / shmem-contoh akan terlepas. Dalam kes ini, anda tidak akan mendapat objek pada output, seperti yang ditunjukkan di bawah ini.

$ ls -l / dev / shm / shmem-contoh

Kesimpulannya

Dalam artikel ini, anda belajar bagaimana menggunakan Memori Bersama POSIX dengan pengaturcaraan C di Ubuntu 20.04, termasuk setiap panggilan fungsi yang digunakan untuk mewujudkan memori bersama. Saya harap artikel ini dapat membantu anda meningkatkan pengetahuan pengaturcaraan anda dan merangkumi setiap keraguan yang anda ada mengenai perkara ini.

Tambahkan isyarat Tetikus ke Windows 10 menggunakan alat percuma ini
Dalam beberapa tahun kebelakangan ini komputer dan sistem operasi telah banyak berkembang. Ada saat ketika pengguna harus menggunakan perintah untuk m...
Mengawal & menguruskan pergerakan tetikus antara beberapa monitor di Windows 10
Pengurus Tetikus Paparan Dwi membolehkan anda mengawal & mengkonfigurasi pergerakan tetikus antara beberapa monitor, dengan memperlahankan pergerakann...
WinMouse membolehkan anda menyesuaikan & meningkatkan pergerakan penunjuk tetikus pada PC Windows
Sekiranya anda ingin meningkatkan fungsi lalai penunjuk tetikus anda gunakan perisian percuma WinMouse. Ia menambah lebih banyak ciri untuk membantu a...