具有不同变量类型的共享内存段 C
Shared memory segment with different variable types C
我正在使用 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);
}
到目前为止一切正常,两个程序通信:一个在结构中修改数据,另一个打印出来。
我还想在共享内存中使用两个整数来充当 'flags' 但我该如何附加和访问它们?
类似于?
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;
我正在使用 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);
}
到目前为止一切正常,两个程序通信:一个在结构中修改数据,另一个打印出来。
我还想在共享内存中使用两个整数来充当 'flags' 但我该如何附加和访问它们? 类似于?
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;