Giriş
Bu yazı shared memory belleğinin sadece byte dizisi şeklinde nasıl kullanılacağını gösteriyor. Daha karmaşık veri yapılarını kullanabilmek için Managed Memory Segments sınıflarına bakılmalı.
1. Önce bir shared memory_object nesnesi yaratılmalı.
Not : Daha özel amaçlar için
Windows'a özel windows_shared_memory,
Unix'e özel xsi_shared_memory,
Unix'e özel anonymous_shared_memory
sınıflarından birisi de kullanılabilir.
2. shared_memory_object nesnesinin uzunluğunu ata
3. mapped_region nesnesi ile belleği uygulamaya dahil et.
4. mapped_region nesnesini byte dizisi gibi kullanarak belleğe okuma yazma işlemleri gerçekleştir
Daha kolay kodlamak için şu satır dahil edilir.
shared_memory_object Sınıfı
Bu yazı shared memory belleğinin sadece byte dizisi şeklinde nasıl kullanılacağını gösteriyor. Daha karmaşık veri yapılarını kullanabilmek için Managed Memory Segments sınıflarına bakılmalı.
1. Önce bir shared memory_object nesnesi yaratılmalı.
Not : Daha özel amaçlar için
Windows'a özel windows_shared_memory,
Unix'e özel xsi_shared_memory,
Unix'e özel anonymous_shared_memory
sınıflarından birisi de kullanılabilir.
2. shared_memory_object nesnesinin uzunluğunu ata
3. mapped_region nesnesi ile belleği uygulamaya dahil et.
4. mapped_region nesnesini byte dizisi gibi kullanarak belleğe okuma yazma işlemleri gerçekleştir
Daha kolay kodlamak için şu satır dahil edilir.
using boost::interprocess;
Ya da şöyle yaparız.
namespace ipc = boost::interprocess;
mapped_region sınıfı
Şu satırı dahil ederiz.
Şu satırı dahil ederiz.
#include <boost/interprocess/mapped_region.hpp>
constructor
Salt okunur işlem için şöyle yaparız.
//Open already created shared memory object.
windows_shared_memory shm (open_only, "shm", read_only);
//Map the whole shared memory in this process
mapped_region region(shm, read_only);
Hem okunur hem yazılır işlem için şöyle yaparız.
//Create a shared memory object
shared_memory_object shm(create_only, "MySharedMemory", read_write);
//Set size to 1
shm.truncate(1);
//Map the whole shared memory in this process
mapped_region region(shm, read_write);
get_addres metodu
region.get_address() ile döndürülen belleği kullanabiliriz.
char *myChar= static_cast<char*>(region.get_address());
get_size metodu
Şöyle yaparız
char *mem = static_cast<char*>(region.get_address());
for (std::size_t i = 0; i < region.get_size(); ++i)
{
std::cout << "Memory value: " << (int)*mem << "\n";
mem++;
}
xsi_shared_memory sınıfı
Şöyle yaparız.
#include <boost/interprocess/xsi_shared_memory.hpp>
#include <boost/interprocess/mapped_region.hpp>
using namespace boost::interprocess;
int main(int argc, char *argv[])
{
//Build XSI key (ftok based)
xsi_key key(argv[0], 1);
//Create a shared memory object.
xsi_shared_memory shm (create_only, key, 1000);
// TODO Remove if exists
printf("shmid: %d\n", shm.get_shmid());
}
Bu sınıfın shmid alanını şöyle görebiliriz.
ipcs -m
key shmid owner perms bytes nattch status
0x00005feb 0 root 666 12000 2
0x00005fe7 32769 root 666 524288 2
0x00005fe8 65538 root 666 2097152 2
0x0001c08e 98307 root 777 2072 0
windows_shared_memory sınıfı
Windows'ta shared memory bu kaynağı kullanan en son uygulama sonlanınca işletim sistemi tarafından otomatik olarak yok edilir. Posix sistemlerde ise shared memory nesnesi kalıcıdır. Uygulamaların yaşam döngüsünden bağımsızdır. Her iki yöntemi birleştirmek için boost interprocess windows'ta memory mapped file kullanır. Eğer bu yöntemi istemiyorsak windows_shared_memory sınıfını kullanırız. Şu satırı dahil ederiz.
#include <boost/interprocess/windows_shared_memory.hpp>
Yazmak için shared memory şöyle yaratılır.
//Create a native windows shared memory object.
windows_shared_memory shm (create_only, "shm", read_write, 65536);
Okumak için shared memory şöyle yaratılır.
//Open already created shared memory object.
windows_shared_memory shm (open_only, "shm", read_only);
Hiç yorum yok:
Yorum Gönder