"Enter"a basıp içeriğe geçin

C Programlama ile POSIX Paylaşılan Bellek – Linux Önerileri

POSIX paylaşılan bellek, POSIX belirtiminde tanımlanan süreçler arası iletişim (IPC) çerçevesidir. Paylaşılan bellek kurulurken, iki (veya daha fazla) görev paylaşılan bellek alanından okuyabilir ve bu alana yazabilir. POSIX paylaşımlı belleği, diğer IPC mimarilerinin (boru, soket, vb.) aksine, her zaman kopyalama zorlamalarını zorlamaz ve belirli programlar için gereklidir.

POSIX paylaşımlı hafıza çağrıları

POSIX paylaşılan bellek işlevleri, bir varlık üzerinde G/Ç etkinlikleri gerçekleştirirken nesnenin bir belge olması gerektiği şeklindeki UNIX konseptine odaklanmıştır. Bu nedenle, ortak bir POSIX bellek varlığını okuyup yazdığınız için, ikincisi bir belge olarak değerlendirilmelidir. Bellek eşlemeli bir belge, paylaşılan belleğin POSIX kaynağıdır. kullanmak shm_open Aşağıdaki sistem çağrısı işlevi /dev/shm, Ayrı paylaşılan bellek belgeleri oluşturulur. Yalnızca iki ayrılmış POSIX Paylaşılan Bellek Sistemi çağrısı vardır, shm_open, e shm_unlink, Açık ve dosya sistemi çağrılarıyla yakından ilgilidir. NS

ftruncate, e harita Belgelere çerçeve çağrıları, POSIX paylaşımlı hafızasındaki diğer görevleri gerçekleştirmek için kullanılır. POSIX paylaşımlı hafıza çağrılarını kullanan bir programı çağırmak gereklidir. -lrt.

POSIX paylaşımlı bellek çağrılarını kullanan programlar aşağıdaki adımlardan geçmelidir:

kullanmak shm_open(), Paylaşılan bir bellek nesnesi oluşturur. Nesne başarılı bir şekilde oluşturulursa, belge tanımlayıcısı alınabilir.

ile birlikte ftruncated(), Nesne boyutu sabitlenecektir.

ile birlikte daha sonra() e Harita Bu nesneyi kullanılabilir adres alanında bulun.

Paylaşılan hafızayı oku/yaz.

Karşısında munmap(), Paylaşılan bellek sınırlarını kaldırın.

kullanmak dördüncü() nesneyi kapatmak için

ile shm_unlink(), Paylaşılan bellekteki nesneyi silin.

shm_open ()

yukarıda açıklandığı gibi, shm_open () Yeni bir paylaşılan bellek nesnesi oluşturmak için kullanılır. Döndürülen kimliği kullanarak arama prosedürü tarafından nesneye erişilebilir hale getirir. İşte bu işlev çağrısının tanımı:

>> int shm_open( sabit karakter *isim, int oflag, mod_t modu);

İlk parametre, paylaşılan bellek nesnesinin adıdır. Bu boş sonlandırılmış bir dizedir. /İsim İlk karakterden başka hiçbir karakterin eğik çizgi olmaması koşuluyla yazın. Oflag, önceden birkaç bayrağı OR-ing yaparak oluşturulan küçük bir adımdır. SADECE O_RD veya O_RDWR. Açıklanan parametreler, paylaşılan bellek nesnesinin henüz mevcut olmadığında (O_CREAT) ve ayrıca nesnenin okuma ve yazma için uygun olduğunda (O_RDWR) oluşturulması gerektiğini belirtir. Son bağımsız değişken, paylaşılan bellek nesnesinin dizin onaylarını belirtir.

shm_unlink()

Shm_unlink() Önceden geliştirilmiş paylaşımlı POSIX belleğinin varlığını ortadan kaldırır. Paylaşılan bellek nesnesinin doğru belge kimliği, etkin bir çağrı aracılığıyla döndürülür. shm_open (). altında belirtildiği gibi shm_open(), Parametre adı, paylaşılan bellek öğesinin adresidir. Sonraki tanımdır shm_unlink() İşlev:

>> int shm_unlink( sabit karakter *İsim);

kes()

Nesneyi ayarladıktan sonra, kes() Varlığın boyutunu bayt cinsinden ayarlama yöntemi kullanımdan kaldırılmıştır. İş tanımı aşağıdaki gibidir:

>> int frangı( int fd, off_t uzunluğu);

Paylaşılan bir POSIX belleği oluştururken, boyut kapasitesi gerçekten sıfır bayttır. Bir POSIX paylaşımlı bellek varlığı bayt uzunluğu oluşturabilirsiniz. kaşlarını çatmak Yürütüldüğünde geri dönmez. kaşlarını çatmak Arıza durumunda -1 çıkışı verir ve a kadar Hatayı tetikleyecek şekilde ayarlanmıştır.

mmmap()

Son olarak, paylaşılan bir bellek varlığına sahip bir bellek eşlemeli belge, mmmap() yöntem. Ardından, paylaşılan bellek varlığına erişmesi amaçlanan bellek eşlemeli bir belge işaretçisi döndürür. Sonraki tanımdır mmmap() İşlev:

>> bozuk *Gözden geçirmek ( Geçersiz *addr, size_t uzunluğu, int koruma, int bayrakları, int fd, off_t ofseti);

Burada, ‘addr’ eşlenecek adrestir. “Uzunluk”, paylaşılan bellek biriminin aralığıdır. Prot değerleri değişebilir ancak PROT OKU | yazma koruması Pek çok işaret var ama paylaşılan hafızanın haritası paylaşılıyor. Şimdi, ‘fd’ önceden elde edilmiş bir belge kimliğidir. Ofset, paylaşılan bellek biriminde eşlemenin başladığı noktadır; 0 ofset değeri de kullanılabilir. mmmap() İşaretçiyi, paylaşılan bellek varlığının eşleme konumuna döndürür.

munmap()

Pozisyonda başlık, boyut ve uzunluk tarafından yönlendirilir, harita Paylaşılan bellek öğesinin eşlemesini kaldırın. ay haritası tamamlandığında 0 ve hata durumunda -1 döndürür; Bu durumda, errno hatayı tetikleyecek şekilde ayarlanır.

>> geçersiz harita ( Geçersiz *Başlık, Boyut_Uzunluk);

Örnek: gönderici ve alıcı

Gönderici ve alıcı örneğini ele alalım. Gönderen, adıyla yeni bir paylaşılan bellek nesnesi oluşturacaktır. / shmem-örnek Ve bunun aracılığıyla paylaşılan belleğe üç sayı yazın. Artık alıcı, paylaşılan bellek nesnesini açığa çıkarabilir ve bellekten üç sayıyı okuyabilir. İsimleriyle üç dosya oluşturacağız. Protokol.h, Gönderen.c, e Alıcı.

$ dokunmak protokol
$ dokunmak gönderen
$ dokunmak Alıcı

Daha sonra aşağıdaki kaynak kodu ‘protocol.h’, ‘sender.c’ ve ‘receiver.c’ dosyalarına ekleyeceğiz. Şimdi hepsini kaydedip kapatacağız.

Şimdi -lrt anahtar sözcüğünü kullanarak sender.c ve receiver.c için yukarıdaki kodu ayrı ayrı derleyip birleştireceğiz. İşte bunu yapmak için komut:

$ GCC -o gönderenden.c -lrt
$ GCC -o alıcı alıcı. c-lrt

Şimdi aşağıdaki komutu kullanarak dağıtıcı kodunu çalıştıracağız. Çıktı aşağıda verilmiştir.

Dağıtıcı kodunu çalıştırarak, paylaşılan bellek nesnesi yaratılmıştır ve altında bulunabilir. / geliştirici / shm Aşağıdaki komutu kullanarak:

$ ls -l /davet/şşt |grep Shamim bir örnektir

Alıcı kodunu çalıştırdığımızda aşağıdaki çıktıyı alacağız:

iş ne zaman gm_unlink() Çağrı, bir nesne olan “receiver.c” dosyası kullanılarak yapıldı. / dev / shm / shmem örneği ayrı olacak Bu durumda, çıktıda aşağıda gösterildiği gibi herhangi bir nesne almazsınız.

$ ls -l /davet/şşt/Shamim bir örnektir

çözüm

Bu makalede, paylaşılan bellek oluşturmak için kullanılan her işlev çağrısı dahil olmak üzere, Ubuntu 20.04’te POSIX Paylaşılan Belleği C programlama ile nasıl kullanacağınızı öğrendiniz. Umarım bu makale programlama bilginizi geliştirmenize yardımcı olmuş ve bu konudaki tüm şüphelerinizi gidermiştir.

Diğer gönderilerimize göz at

[wpcin-random-posts]

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir