2013-12-07 3 views
0

Мне нужна помощь с этим кодом.сегмент разделяемой памяти shmget shmat двойной доступ и

Я создал в общем сегменте 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; 
+0

что это значит ??? – user244050

+0

Всегда старайтесь публиковать компилируемую исполняемую программу, а не фрагменты, которые нужно закончить вручную и собрать. –

ответ

0

Возможно, вы просто не видите, что второй printf() печатает для %s, потому что вывод линии буферного и показывает только после того, как другой \n ставятся на stdout. Лучше закончите строку формата с \n, когда это возможно.

Смежные вопросы