簡體   English   中英

共享內存段shmget shmat雙重訪問都

[英]shared memory segment shmget shmat double access both

我需要有關此代碼的幫助。

我在共享段中創建了一個struct msg_t ,在另一個段中,創建了一個簡單的string 在這種方法中,首先附加兩個段,然后再初始化字符串。 然后嘗試將指向該字符串(在第二段中分配)的指針寫入struct msg_t的字段(在第一段中)。 我做了很多測試,但似乎當我嘗試打印從第一段訪問的該字段的內容時,它會打印“”。

我怎樣才能做到這一點 ?? 謝謝您的幫助。

msg_t* msg_init_string(void* content) {
    //viene creata una copia "privata" della stringa
    msg_t* new_msg;
    int new_msg_id;
    int content_id;
    char* string = (char*) content;
    if ((new_msg_id = shmget(ftok(FILENAME2,'N'),sizeof(msg_t),IPC_CREAT|0666)) == -1) {
        perror("shmget() for array_msg");

        exit(-1);
    }
    if ((content_id = shmget(ftok(FILENAME2,'C'),(strlen(string) + 1),IPC_CREAT|0666)) == -1) {
        perror("shmget() for array_msg");

        exit(-1);
    }
    new_msg = (msg_t*)shmat(new_msg_id, NULL,0);

    char* new_content =(char*)shmat(content_id,NULL,0);// +1 per \0 finale
    strcpy(new_content, string);
    printf("here \n %s",(char*)(new_content));


//here it seems not working..because then, it can not print anything!!
    new_msg->content =new_content;

    printf("here \n %s",(char*)(new_msg->content));



    return new_msg;

我簡單的struct msg_t是:

typedef struct msg {

void* content; // generico contenuto del messaggio

struct msg * (*msg_init)(void*); // creazione msg

void (*msg_destroy)(struct msg *); // deallocazione msg

struct msg * (*msg_copy)(struct msg *); // creazione/copia msg

} msg_t;

可能您只是看不到%s的第二個printf()打印的內容,因為輸出是行緩沖的,並且僅在將另一個\\n放入stdout后才顯示。 在可行的情況下,最好使用\\n結束格式字符串。

暫無
暫無

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

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