2016-10-23 3 views
0

Привет, этот код отлично работает в целых числах с общей памятью, но я хочу хранить строки, как я могу изменить его для этого?
Например, выход будет Письменное: Это номер строки 1 и в следующей строке: Это линия номер 2Сохраните строку в общей памяти C

#include <string.h> 
#include <stdio.h> 
#include <memory.h> 
#include <sys/shm.h> 
#include <unistd.h> 


void main() 
{ 
    key_t Clave; 
    int Id_Memoria; 
    int *Memoria = NULL; 
    int i,j; 



    Clave = ftok ("/bin/ls", 33); 
    if (Clave == -1) 
    { 
     printf("No consigo clave para memoria compartida"); 
     exit(0); 
    } 


    Id_Memoria = shmget (Clave, 1024, 0777 | IPC_CREAT); 
    if (Id_Memoria == -1) 
    { 
     printf("No consigo Id para memoria compartida"); 
     exit (0); 
    } 


    Memoria = (int *)shmat (Id_Memoria, (char *)0, 0); 
    if (Memoria == NULL) 
    { 
     printf("No consigo memoria compartida"); 
     exit (0); 
    } 



     for (j=0; j<100; j++) 
     { 
      Memoria[j] = j; 
      printf("Written: %d \n" ,Memoria[j]); 
     } 




    shmdt ((char *)Memoria); 
    shmctl (Id_Memoria, IPC_RMID, (struct shmid_ds *)NULL); 
} 
+0

В C строка представляет собой последовательность элементов 'char', за которой следует специальный символ' '\ 0''. Разница между «массивом» целых чисел и «массивом» символов - это размер каждого элемента, а в строках есть терминатор. –

+0

опубликованный код не очищает компиляцию. По двум причинам. 1) отсутствует инструкция: '#include ' 2) тип возврата из функции 'main()' - 'int', а не' void'. При компиляции всегда включайте предупреждения, затем устанавливайте эти предупреждения. (для 'gcc', при минимальном использовании:' -Wall -Wextra -pedantic' Я также использую: '-Wconversion -std = gnu99') – user3629249

ответ

0

необходимо скопировать строку посимвольно в общую память. Фактический указатель, указывающий на переменную в общей памяти, должен оставаться снаружи, поскольку разделяемая память может быть в разных адресах в разных процессах. (Вы можете использовать указатели дельты, но они намного проще в C++ boost::offset_ptr)

Для управления строками в string.h используются функции командной строки. Специально strncpy было бы полезно при перемещении строк в разные ячейки памяти.

Также было бы неплохо использовать новую совместную память posix вместо текущей реализации sysv. Вы можете увидеть более подробную информацию о общей памяти posix в справочной странице shm_overview. Конечно, если у вас есть старая ОС, которая поддерживает только интерфейс sysv, вам придется придерживаться старого api.