【问题标题】:Shared memory segment with different variable types C具有不同变量类型的共享内存段 C
【发布时间】:2018-06-11 14:54:33
【问题描述】:

我正在使用 Linux。

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

这是一段代码 sn-p,展示了我如何创建共享内存块。

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;

然后将指针设置到共享内存中的结构数组之后?

【问题讨论】:

标签: c linux memory struct shared


【解决方案1】:

你是正确的。您可以根据需要将这些项目放在您的记忆中。看起来您已经为您的标志分配了存储空间

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;

【讨论】:

  • 这些天,我会推荐POSIX共享内存,见shm_overview(7)
  • 你会发现随着你的数据结构变得越来越大,指针访问器会变得越来越难看。人们通常会(正确地)转向以可移植方式处理这些数据结构的格式。 JSON 或 Google protobufs 会很有用。请注意,此实现依赖于编译器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多