簡體   English   中英

誰能幫助我在C中創建共享內存段

[英]Can anyone help me make a Shared Memory Segment in C

我需要創建一個共享內存段,以便可以有多個讀取器和寫入器訪問它。 我認為我對信號量以及讀者和作家的所作所為...

但是對於如何創建共享內存段我一無所知。 我希望該段包含20個結構的數組。 每個結構將包含一個名字,一個int和另一個int。

誰能幫我至少開始這一步? 我很絕望,在網上閱讀的所有內容都讓我更加困惑。

編輯:好的,所以我要做類似的事情

int memID = shmget(IPC_PRIVATE, sizeof(startData[0])*20, IPC_CREAT);

使用startData作為保存我的數據的結構數組初始化,並且出現錯誤消息“ Segmentation Fault(core dumped)”

獲取共享內存的現代方法是使用Single UNIX Specification提供的API。 這是一個包含兩個過程的示例-一個過程創建一個共享內存對象並將一些數據放入其中,另一個過程讀取它。

第一步:

#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>

#define SHM_NAME "/test"

typedef struct
{
   int item;
} DataItem;

int main (void)
{
   int smfd, i;
   DataItem *smarr;
   size_t size = 20*sizeof(DataItem);

   // Create a shared memory object
   smfd = shm_open(SHM_NAME, O_RDWR | O_CREAT, 0600);
   // Resize to fit
   ftruncate(smfd, size);
   // Map the object
   smarr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, smfd, 0);

   // Put in some data
   for (i = 0; i < 20; i++)
      smarr[i].item = i;

   printf("Press Enter to remove the shared memory object\n");
   getc(stdin);

   // Unmap the object
   munmap(smarr, size);
   // Close the shared memory object handle
   close(smfd);
   // Remove the shared memory object
   shm_unlink(SHM_NAME);

   return 0;
}

該過程使用shm_open()創建一個共享內存對象。 創建的對象的初始大小為零,因此使用ftruncate()對其進行了放大。 然后使用mmap()將對象內存映射到進程的虛擬地址空間。 這里重要的是,映射是可讀寫的( PROT_READ | PROT_WRITE ),並且是共享的( MAP_SHARED )。 映射完成后,就可以將其作為常規的動態分配內存進行訪問(事實上,Linux上glibc malloc()使用匿名內存映射進行較大的分配)。 然后,該過程將數據寫入陣列,並等待直到按下Enter鍵。 然后,它使用munmap()取消munmap()對象,關閉其文件句柄,並使用shm_unlink()取消鏈接對象。

第二道工序:

#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>

#define SHM_NAME "/test"

typedef struct
{
   int item;
} DataItem;

int main (void)
{
   int smfd, i;
   DataItem *smarr;
   size_t size = 20*sizeof(DataItem);

   // Open the shared memory object
   smfd = shm_open(SHM_NAME, O_RDONLY, 0600);
   // Map the object
   smarr = mmap(NULL, size, PROT_READ, MAP_SHARED, smfd, 0);

   // Read the data
   for (i = 0; i < 20; i++)
      printf("Item %d is %d\n", i, smarr[i].item);

   // Unmap the object
   munmap(smarr, size);
   // Close the shared memory object handle
   close(smfd);

   return 0;
}

這將打開共享內存對象以供只讀訪問,並且內存將其映射為只讀訪問。 寫入smarr數組元素的任何嘗試都將導致傳遞分段錯誤。

編譯並運行第一個進程。 然后在單獨的控制台中運行第二個過程,並觀察輸出。 第二個過程完成后,返回第一個過程,然后按Enter鍵清理共享內存塊。

有關更多信息,請查閱每個功能的手冊頁或SUS的內存管理部分(最好參考手冊頁,因為它們記錄了這些功能在系統中的特定行為)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM