gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:40:11 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com