共享内存段shmget shmat double访问两者

时间:2013-12-07 18:38:19

标签: c struct shared-memory

我需要一些关于此代码的帮助。

我在共享片段中创建了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;

1 个答案:

答案 0 :(得分:0)

可能您只是看不到第二个printf()%s打印的内容,因为输出行缓冲并且仅在另一个\n之后显示放到stdout。在可行的情况下,最好使用\n结束格式字符串。