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