使用不同变量类型的共享内存段(C语言)

3

我正在使用Linux操作系统。

使用共享内存在两个不同的程序之间存储静态结构体数组。

下面是创建共享内存块的代码片段。

typedef struct {
 int ID;
 int nData;
 int time;
} strPrintJob;

size = (sizeof(strPrintJob) * lRetMaxJobs) + (sizeof(int) * 2);
strPrintJob *shmPrintJob;

    //Create data segment
    if((nShmid = shmget(nKey, size, IPC_CREAT | 0666)) < 0)
    {
        perror("shmget");
        exit(1);
    }

    shmPrintJob = (strPrintJob *) shmat(nShmid, NULL, 0);
    if (shmPrintJob == (strPrintJob *)(-1))
    {
        perror("shmat");
        exit(1);
    }

目前一切运作良好,两个程序能够相互通信:一个程序修改结构体中的数据,另一个程序将其打印出来。

我还想在共享内存中使用两个整数作为“标志”,但如何附加和访问它们呢? 大致需要这样实现:

int *shmnFlagOne, *nPtr;

if((shmnFlagOne = shmat(nShmid, NULL, 0)) == -1)
{
   perror("shmat");
   exit(1);
}

nPtr = shmnFlagOne;

然后将指针设置为在共享内存中结构体数组之后?

请考虑使用 POSIX 共享内存,参见 shm_overview(7) - Basile Starynkevitch
1个回答

0

你走在正确的轨道上。你可以根据需要将这些项目放入内存中。看起来你已经为标志分配了存储空间。

2 * sizeof(int)

你可以通过指针转换的多种方式来访问它们。

它看起来会像这样:

void *shared_memory = shmat(nShmid, NULL, 0);
strPrintJob *shmPrintJob = (strPrintJob *) shared_memory;
int *flags = (int *) shared_memory[sizeof(strPrintJob) * lRetMaxJobs / sizeof(int)];

好的,有点恶心。但这只是最小的变化。 另一种选择是创建另一个结构体来包装你的结构体:

typedef struct {
    strPrintJob[lRetMaxJobs] printJobs;
    int flags[2];
} PrintJobWrapper;

现在使用PrintJobWrapper像以前一样访问您的共享内存:

PrintJobWrapper *print_wrapper = (PrintJobWrapper *) shmat(nShmid, NULL, 0);
print_wrapper->flags[0] = xxx;

1
现在,我建议使用POSIX共享内存,请参见shm_overview(7) - Basile Starynkevitch
随着数据结构不断变大,你会发现指针访问器变得越来越丑陋。人们通常(正确地)会转向处理这些数据结构的便携式格式。JSON 或 Google protobufs 是很有用的。请注意,此实现依赖于编译器。 - natersoz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接