c - 具有不同变量类型的共享内存段 C

标签 c linux memory struct shared

我正在使用 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;

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

最佳答案

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

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;

关于c - 具有不同变量类型的共享内存段 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48051856/

相关文章:

c++ - 改变其他静态库使用的静态库

android - 将 Linux 与 Android 一起安装的目的是什么?

linux - 在我的服务器上部署和构建我的 go 应用程序

linux - 使用 sed 在文件中插入另一个 sed 命令

php - 大型数组的 PHP QuickHash 经验

c++ - 在 C++ 中存储对对象的引用需要多少内存?

c - 如何在 C 中处理指针?

将函数复制到可执行页面并调用

javascript - Node.js (node-pg) 或 C (libpq) - 执行 PostgreSQL 请求而不等待响应?

linux - Windows 与 Linux 的内存使用情况