2016-10-23 4 views
0

Hallo, dieser Code funktioniert gut Speichern auf einem gemeinsamen Speicher Ganzzahlen, aber ich möchte Zeichenfolgen speichern, wie kann ich es ändern, um das zu tun?
Zum Beispiel wird die Ausgabe geschrieben: Dies ist die Zeile Nummer 1 und in der nächsten Zeile geschrieben: Dies ist die Zeilennummer 2Speichern Sie eine Zeichenfolge in einem freigegebenen Speicher 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

In C ist eine Zeichenfolge nur eine Folge von 'char' Elementen, gefolgt vom Sonderzeichen' '\ 0''. Der Unterschied zwischen einem "Array" von ganzen Zahlen und einem "Array" von Zeichen ist die Größe jedes Elements, und diese Zeichenfolgen haben einen Terminator. –

+0

Der gepostete Code wird nicht kompiliert. Aus zwei Gründen. 1) fehlende Anweisung: '#include ' 2) der Rückgabetyp von der 'main()' Funktion ist 'int', nicht' void'. Aktivieren Sie beim Kompilieren immer die Warnungen und beheben Sie diese Warnungen. (für 'gcc', bei minimaler Verwendung:' -Wall -Wextra -pedantic' verwende ich auch: '-Wconversion -std = gnu99') – user3629249

Antwort

0

Sie müssen String Zeichen für Zeichen in dem gemeinsamen Speicher kopieren. Der tatsächliche Zeiger, der auf die Variable im Shared Memory zeigt, muss draußen bleiben, da Shared Memory sich in verschiedenen Adressen in verschiedenen Prozessen befinden kann. (Sie könnten Delta-Zeiger verwenden, aber sie sind viel einfacher in C++

Zum Bearbeiten von Zeichenfolgen gibt es Zeichenfolge Dienstprogrammfunktionen in string.h. Speziell strncpy wäre nützlich, wenn Strings zu verschiedenen Speicherorten verschoben werden.

Es wäre auch eine gute Idee, anstelle der aktuellen sysv-Implementierung den neuen posix shared memory zu verwenden. Sie können weitere Details zum Posix Shared Memory in der Manpage shm_overview sehen. Natürlich, wenn Sie ein altes Betriebssystem haben, das nur sysv-Schnittstelle unterstützt, dann müssen Sie bei alten API bleiben.

Verwandte Themen