[英]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.