簡體   English   中英

具有不同變量類型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);
    }

到目前為止,一切工作正常,並且兩個程序可以通信:一個在結構中修改數據,另一個在打印出來。

我還想在共享內存中使用兩個整數來充當“標志”,但是我將如何附加和訪問它們呢? 有什么類似的?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM