2017-09-11 2 views
-1

Das Ziel dieses Codes ist es, einen gemeinsamen Speicherbereich zu erstellen und den n-Wert in das untergeordnete Element zu schreiben und dann alle generierten Zahlen aus dem übergeordneten Prozess zu drucken. Aber dies druckt momentan nur Speicheradressen wie 16481443B4 aus, die sich jedes Mal ändern, wenn ich das Programm starte. Ich bin mir nicht sicher, ob ich falsch in den Shared Memory schreibe oder falsch aus dem Shared Memory lese. Möglicherweise beides.Problem beim Schreiben und Lesen von gemeinsam genutztem Speicherplatz c

#include <sys/types.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <wait.h> 
#include <fcntl.h> 
#include <sys/stat.h> 
#include <sys/shm.h> 
#include <sys/mman.h> 

int main(int argc, char** argv){ 

    //shared memory file descriptor 
    int shm_fd; 

    //pointer to shared memory obj 
    void *ptr; 
    //name of shared obj space 
    const char* name = "COLLATZ"; 

    //size of the space 
    const int SIZE = 4096; 

    //create a shared memory obj 
    shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); 

    //config size 
    ftruncate(shm_fd, SIZE); 

    //memory map the shared memory obj 
    ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0); 

    int n = atoi(argv[1]); 
    pid_t id = fork(); 

    if(id == 0) { 
     while(n>1) { 
      sprintf(ptr, "%d",n); 
      ptr += sizeof(n); 
      if (n % 2 == 0) { 
       n = n/2; 
      } else { 
       n = 3 * n + 1; 
      } 
     } 
     sprintf(ptr,"%d",n); 
     ptr += sizeof(n); 
    } else { 
     wait(NULL); 
     printf("%d\n",(int*)ptr); 
    } 

    //Umap the obj 
    munmap(ptr, SIZE); 

    //close shared memory space 
    close(shm_fd); 

    return 0; 
} 
+0

An welchem ​​Punkt überprüfen Sie für Fehler? – spectras

+0

Ich habe keine Fehlerüberprüfung Code Ich kann davon ausgehen, dass die Eingabe immer korrekt ist –

+1

Sagt wer? Jeder einzelne Anruf, den Sie verwenden, kann fehlschlagen. 'shm_open' kann' -1' zurückgeben. So kann 'ftruncate'. 'mmap' kann' MAP_FAILED' zurückgeben. 'fork' kann auch' -1' zurückgeben. Sie ** müssen ** nach Fehlerbedingungen suchen und danach handeln (z. B. den Fehlercode aus 'errno' ausdrucken, zB mit [' perror'] (https://linux.die.net/man/3/perror) und quit). – spectras

Antwort

1

Hören Sie Ihren Compiler!

$ gcc main.c -lrt 
main.c: In function 'main': 
main.c:51:9: warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=] 
    printf("%d\n",(int*)ptr); 
     ^

Vorausgesetzt, dass Sie die ganze Zahl drucken möchten spitz durch ptr, sollte es sein:

printf("%d\n",*((int*)ptr)); 
+0

Das ist ein Anfang, aber es gibt so viele Dinge falsch in der geposteten Probe. Leerer Zeigerarithmetik? falsche Systemaufrufargumente? Mangel an Fehlerprüfung? Missverständnis der String-Darstellung? Nur von einem kurzen Blick, ohne den Code zu starten. – spectras

+0

@spectras Ja, es gibt viele Dinge, die mit dem Code nicht stimmen, aber das wird das unmittelbare Problem des Ausdruckens des rohen Zeigerwertes beheben. – Tim

Verwandte Themen