簡體   English   中英

如何處理共享內存中的結構

[英]How to handle structs in Shared memory

我已經在C語言中創建了一個結構。現在,我想在該結構中寫入一些數據,並希望其他進程讀取它。 假設作者為服務器,讀者為客戶端。

對於編寫者而言,代碼如下:

typedef struct 
{
    pthread_mutex_t mutex;
    char * data;

} shm_data_struct, *shm_data_struct_t;
int shmid;
char * shm_address;
shm_data_struct_t shm_ptr;


int main(int argc, char const *argv[])
{
    shmid = shmget(KEY, sizeof(shm_data_struct), IPC_CREAT | 0666)
    shm_address = shmat(shmid, (void*)0, 0)
    shm_ptr = (shm_data_struct_t)shm_address;
    //Writing into struct
    shm_ptr->data = "String";
    while(shm_ptr->data != '*'){
        sleep(1);
    }
}

對於客戶端:

typedef struct 
{
    pthread_mutex_t mutex;
    char * data;

} shm_data_struct, *shm_data_struct_t;

int main(int argc, char const *argv[])
{
    int shmid;
    key_t key;
    char *shm;
    shm_data_struct_t shm_ptr;
    key = 120;
    shmid = shmget(key, sizeof(shm_data_struct), 0666)
    shm = shmat(shmid, NULL, 0)

    /*
     * Now read what the server put in the memory.
     */
    shm_ptr = (shm_data_struct_t)shm;
    printf("%s\n", shm_ptr->data);
    shm_ptr->data = '*';

    exit(0);
}

此代碼使我在客戶代碼的打印語句中出現分段錯誤。 有人可以幫我做錯什么嗎?

這是你的問題:

    char * data;

僅指針(即地址)被存儲在共享內存中。 指針所指向的數據不會共享,並且指針本身將在另一個進程中無效或指向意外數據。

一般來說,SysV共享內存是IPC的較差形式,通常應避免使用。 正如您所發現的,它甚至不能輕易存儲中等復雜的數據結構。 它也很容易出現爭用情況,並且如果避免使用這種鎖定結構(例如SysV信號),則使用它們的進程崩潰時通常會創建死鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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