2017-08-14 3 views
1

Ich habe zwei Tage gekämpft, um zu versuchen, diesen letzten Fehler in meinem Code zu beheben, aber ich kann den Fehler nicht finden. Der Code ist setzt auf (in dieser Reihenfolge):Wie sende ich Daten im richtigen Format entlang der zweiten Pipe zurück?

  1. eine Zeichenfolge vom Benutzer empfangen (in diesem Fall mich)
  2. ein Kind Prozess
  3. Erstellen Sie die Zeichenfolge an den Prozess Kind senden
  4. die Nacharbeits String, so dass jedes Wort beginnt mit einem Großbuchstaben
  5. senden Sie die Zeichenfolge zurück an den Eltern mit den Änderungen
  6. Anzeige der String

Der Code läuft gut, bis der Eltern gelesen wird. Ein Beispiel Ausgabe lautet:

Eingang: "Hallo"

Eltern schreibt "Hallo"

Kind liest "Hallo"

Kind schreibt "Hallo dort"

Eltern liest @ # $%^$ #%^& * - oder einige andere solche Nicht-Standard-Zeichen, dann zeigt Fehler -

doppelt frei oder cor ruption (out): 0x00007ffeeebb2690 ***

Unten ist mein Code:

#include <iostream> 
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <string> 
#include <algorithm> 

using namespace std; 

int main(){ 
    int fd[2]; 
    int pfc[2]; 
    int status = 0; 
    string val = ""; 

    if(pipe(fd) == -1 || pipe(pfc) == -1) fprintf(stderr,"Pipe failed"); 

    pid_t pid = fork(); 

    // fork() returns 0 for child process, child-pid for parent process. 
    if (pid == 0){ // child: reading only, so close the write-descriptor 
     string writeval = ""; 
     close(fd[1]); 

     // now read the data (will block) 
     read(fd[0], &val, sizeof(val)); 
     cout << "Child reads " << val.c_str() << endl; 
     string temp = " " + val; 
     transform(temp.begin(), temp.end(), temp.begin(), ::tolower); 
     for(size_t i = 1; i < temp.length(); i++){ 
      if(!isspace(temp[i]) && isspace(temp[i-1])){ 
       temp[i] = toupper(temp[i]); 
      } 
     } 
     writeval = temp.substr(1, temp.length() - 1); 

     // close the read-descriptor 
     close(fd[0]); 
     close(pfc[0]); 
     cout << "Child writes " << writeval.c_str() << endl; 

     write(pfc[1], &writeval, sizeof(writeval)); 

     close(pfc[1]); 
     exit(0); 
    } 
    else{ 
     string readval = ""; 
     string temp =""; 
     // parent: writing only, so close read-descriptor. 
     close(fd[0]); 

     // send the value on the write-descriptor. 
     while(getline(cin, temp)){ 
      val += temp; 
     } 
     write(fd[1], &val, sizeof(val)); 

     cout << "Parent writes " << val << endl; 
     // close the write descriptor 
     close(fd[1]); 
     //wait(&status); 
     close(pfc[1]); 
     read(pfc[0], &readval, sizeof(readval)); 
     cout << "Parent reads " << readval << endl; 
     close(pfc[0]); 

    } 
    return 0; 
} 

Antwort

0

Die Antwort ist einfach. Im Kindprozess übergab ich den Speicherplatz von writeval beim Schreiben zurück an die Elternmethode, aber im Elternprozess versuchte ich, aus dem Speicherort von readval zu lesen. Dies wird behoben, indem man sie so ändert, dass sie die gleiche Variable außerhalb der if/else-Aufrufe ist, wie dies bei der Variablen val der Fall war.

Weitere Informationen darüber, warum dies ein Problem ist, finden Sie unter here.

Verwandte Themen