[英]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);
}
到目前為止,一切工作正常,並且兩個程序可以通信:一個在結構中修改數據,另一個在打印出來。
我還想在共享內存中使用兩個整數來充當“標志”,但是我將如何附加和訪問它們呢? 有什么類似的?
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.