2017-01-04 1 views
0

Ich schreibe und lese aus dem gemeinsamen Speicher eine Zeichenfolge. es ist hier mein Code:Linux-C Lesen von Daten aus dem gemeinsam genutzten Speicher es ist beschädigt

Dies ist der Schriftsteller (ich habe ommited nicht verwandten Code)

int main() { 

    char message[MAX_BUF]; 
    key_t key; 
    int sharedMemoryId; 
    int semaphoreId; 
    char *vc1; 
    char *data; 
    pid_t p3; 
    struct sembuf operations[1]; 

    printf("start p2\n"); 

    saveMesageInBuffer(message); //This reads message from pipe and saves into message variable 

    if(message==NULL){ 
     return -1; 
    } 

    key = getKeyForFile(); 

    if(key != -1){ 

     sharedMemoryId = createSharedMemoryId(key); 
     if(sharedMemoryId!=-1){ 
     vc1 = shareContentInMemoryId(sharedMemoryId); 
     } 

     switch(p3 = fork()){ 
     case -1: 
      printf("Error"); 
      break; 
     case 0: 
      printf("run\n"); 
      execl("./Ej3", "Ej3", NULL); 
      break; 
     default: 
      sleep(SECONDS); 
      writeMessageInSharedVariable(vc1, message); 
      pause(); 
      break; 
    } 

    } else { 
     printf("Error getting key for file: %s\n", strerror(errno)); 
    } 

    return 0; 
} 

void writeMessageInSharedVariable(char *dest, char *message){ 
    printf("El proceso P2 (PID=%d, Ej2) transmite un mensaje al proceso P3 a traves de una variable en memoria compartida\n", getpid()); 
    strncpy(dest, message, MAX_BUF); 
} 

int createSharedMemoryId(key_t key){ 
    return shmget(key, MAX_BUF, IPC_CREAT | 0600); 
} 

char* shareContentInMemoryId(int memoryId){ 
    return shmat(memoryId, (void *)0, 0); 
} 

key_t getKeyForFile(){ 
    char filePath[1024]; 
    if (getcwd(filePath, sizeof(filePath)) != NULL){ 
     strcat(filePath, "/"); 
     strcat(filePath, FIFO_FILE_NAME); 
     return ftok(filePath, 0777); 
    } else { 
    return (key_t) -1; 
    } 
} 

`

Dies ist der Leser (kompiliert als Ej3 und über fork und exec gestartet von Schreiber)

Ich schreibe Test in Nachricht und das ist das Ergebnis, während ich es lese.

readed test [] w

+3

Offensichtlich fehlt Ihnen die abschließende Null. Es ist also überhaupt nicht "verdorben". – usr2564301

+0

Sorry, ich verstehe Sie nicht – colymore

+3

@coolymore Das '% s' Format ist für den Druck einer C-Zeichenfolge, die ein Array von Bytes mit einem abschließenden Null-Byte ist. Sie legen das Nullbyte nicht am Ende der Zeichenfolge im Shared Memory ab, sodass Sie den Papierkorb danach drucken. – Barmar

Antwort

3

strncpy(dest, message, MAX_BUF);

strncpy doesn't null-terminate the buffer. Sie müssen es selbst null-terminieren.

strncpy(dest, message, MAX_BUF); 
dest[MAX_BUF-1] = '\0'; /* <- like this */ 

printf(%s nimmt C-String, der am Ende ein char-Array mit einem Null-Zeichen ist. Wenn Sie die Zeichenfolge nicht nullterminieren, wird printf nicht wissen, wann zu stoppen, also die Müllausgabe.

Verwandte Themen