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?
- eine Zeichenfolge vom Benutzer empfangen (in diesem Fall mich)
- ein Kind Prozess
- Erstellen Sie die Zeichenfolge an den Prozess Kind senden
- die Nacharbeits String, so dass jedes Wort beginnt mit einem Großbuchstaben
- senden Sie die Zeichenfolge zurück an den Eltern mit den Änderungen
- 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;
}