FIFO und vector<int>



  • Hallo Allerseits,

    bin neu im Forum und hab schon ein RIESEN Problem. Ich will eine Client Server Anwendung die über FIFO's kommunizieren programmieren. Mein Server erstellt die FIFO folgendermaßen

    /*  Rechte für das FIFO setzen  */
    	umask(0);		
    	/*  FIFO erzeugen  */
    	if(mkfifo(FIFO, 0666) == -1){
    		/*  FIFO ist bereits vorhanden  */
    		if(errno == EEXIST){
    			perror("mkfifo()");	
    		}else{
    			perror("mkfifio()");
    			exit(EXIT_FAILURE);	
    		}
    	}
            if((this->fd_fifo = open(FIFO, O_WRONLY)) == -1){
    		perror("open()");
    		exit(EXIT_FAILURE);	
    	}
    
           //PER FORK und EXEC ein KINDPROZESS erstellen
    
           //DER ELTERNPROZESS MACHT DAS
            write(this->fd_fifo, (char *)&Topology, sizeof(Topology));
    	close(fd_fifo);
    
           //DER KINDPROZESS RUFT EIN PROGRAMM MIT EXEC AUF WELCHES FOLGENDES MACHT
           if((r_fifo = open(FIFO, O_RDONLY)) < 0){
    		perror("open()");
    		exit(EXIT_FAILURE);	
    	}
    	std::vector<int> test;
       read(r_fifo, (char *)&test, sizeof(test));
    

    TOPOLOGY ist ein std::vector<int> und wurde mit push_back() befüllt.
    Der Programm gibt bei der Ausgabe von SIZE des Vektors im Programm des Kindprozesses die korrekte Grösse aus, aber die gesetzten Inhalte sind nicht drin. Das heisst wenn ich nach dem read des KINDPROZESSES mit:

    std::cout << test.size() << std::endl;
      std::cout << test[0] << std::endl;
    

    Die Werte auslesen will, gibt er die SIZE richtig aus (falls z.B. drei Werte drin sind) aber nicht die Werte an sich (also das test[0]).

    Ich hoffe meine Erklärung war nicht zu unverständlich und jemand kann mir behilflich sein.

    Gruss und schon mal DANKE vielmals

    Schaf



  • sizeof gibt dir nur die größe des vector<int> objekts, das ist nicht die größe, die die ints belegen. Ausserdem solltest du nur die daten und nicht den vector selber in die datei schreiben.

    so müsste es gehen:

    // schreiben
    write(fd, &topologie[0], topologie.size()*sizeof(int));
    // lesen
    vector<int> test(größe-von-oben);
    read(fd. &test[0], test.size());
    


  • Mhm... danke für den Tip.

    Aber im Allgemeinen: Warum kann ich nicht gleich den ganzen Vektor speichern. Falls ich z.B. einen Graphen aufbauen will, von dem ich einfach noch nicht weiss wieviele Ecken er haben wird und ich diese Datenstruktur erst nach dem Aufbau per FIFO an einen anderen Prozess schicken will, dann muss das doch direkt speicherbar sein oder? Eine Datenstruktur kann man ja auch in eine Datei schreiben und wieder auslesen!?!



  • der vector enthält ja nur nen zeiger auf den eigentlichen datenbereich, den über die fifo zu schicken (oder in eine datei zu schreiben) bringt nicht viel.

    du kannst dir ein protokoll ausdenken, zum beispiel erst einen int durch die fifo schicken, in dem die anzahl steht und dann danach die eigentlichen daten und der empfänger wertet das entsprechend aus.


Anmelden zum Antworten