Saya memiliki sedikit masalah dengan salah satu proyek saya.
Saya telah mencoba untuk menemukan contoh yang terdokumentasi dengan baik tentang penggunaan memori bersama fork()
tetapi tidak berhasil.
Pada dasarnya skenario adalah bahwa ketika pengguna memulai program, saya perlu menyimpan dua nilai dalam memori bersama: current_path yang merupakan char * dan nama_file yang juga char * .
Bergantung pada argumen perintah, proses baru dimulai fork()
dan proses itu perlu membaca dan memodifikasi variabel current_path yang disimpan dalam memori bersama sementara variabel nama_file hanya baca.
Apakah ada tutorial bagus tentang memori bersama dengan kode contoh (jika mungkin) yang dapat Anda arahkan ke saya?
c
linux
fork
shared-memory
bleepzter.dll
sumber
sumber
shmget()
dkk. dan jugammap()
pendekatan murni denganMAP_ANON
(aliasMAP_ANONYMOUS
) - meskipunMAP_ANON
tidak ditentukan oleh POSIX. Ada juga POSIXshm_open()
danshm_close()
untuk mengelola objek memori bersama. [… Lanjutan…]shm_unlink()
), sedangkan mekanisme yang menggunakanmmap()
memerlukan file danMAP_SHARED
untuk bertahan data (danMAP_ANON
menghalangi ketekunan). Ada contoh lengkap di bagian Rationale dari spesifikasishm_open()
.Jawaban:
Ada dua pendekatan:
shmget
danmmap
. Saya akan membicarakannyammap
, karena ini lebih modern dan fleksibel, tetapi Anda dapat melihatman shmget
( atau tutorial ini ) jika Anda lebih suka menggunakan alat gaya lama.The
mmap()
fungsi dapat digunakan untuk mengalokasikan buffer memori dengan parameter yang sangat disesuaikan untuk akses kontrol dan hak akses, dan untuk mendukung mereka dengan penyimpanan file-sistem jika diperlukan.Fungsi berikut membuat buffer dalam memori yang dapat dibagikan oleh proses dengan anaknya:
Berikut ini adalah contoh program yang menggunakan fungsi yang ditentukan di atas untuk mengalokasikan buffer. Proses induk akan menulis pesan, garpu, dan kemudian menunggu anaknya memodifikasi buffer. Kedua proses tersebut dapat membaca dan menulis memori bersama.
sumber
shmget
adalah cara yang sangat kuno, dan beberapa orang akan mengatakan usang, cara untuk melakukan memori bersama ... Lebih baik menggunakanmmap
danshm_open
, file biasa, atau sederhanaMAP_ANONYMOUS
.Berikut adalah contoh memori bersama:
Langkah :
Gunakan ftok untuk mengubah nama jalur dan pengidentifikasi proyek menjadi kunci IPC System V.
Gunakan shmget yang mengalokasikan segmen memori bersama
Gunakan shmat untuk melampirkan segmen memori bersama yang diidentifikasi oleh shmid ke ruang alamat proses panggilan
Lakukan operasi di area memori
Lepaskan menggunakan shmdt
sumber
Ini termasuk untuk menggunakan memori bersama
sumber
coba contoh kode ini, saya mengujinya, sumber: http://www.makelinux.net/alp/035
sumber
shmget
danshmat
dari proses yang berbeda), yang merupakan inti dari memori bersama ... = (Berikut contoh mmap:
sumber
open
menambahkan overhead I / O file. Gunakanshm_open
sebagai gantinya.