So arbeite ich derzeit an einer Zuordnung und auf meinem Laptop funktioniert es gut, aber auf meinem PC ist der Ausgang Kauderwelsch.C++ verschiedene Ausgabe aus dem gleichen Programm auf zwei Systeme
Geben Sie einen Befehl:
ein
einen Befehl eingeben:
a'Zéÿ Befehl empfangen.
Ignorieren meiner vermasselten Ausgabe warum gibt es eine'Zéÿ in der Ausgabe?
Auf meinem Laptop funktioniert der Code wie vorgesehen.
Hier ist ein kleiner Beispielcode:
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <iostream>
using namespace std;
int main(){
int pipefd[2];
pid_t cpid, ppid;
char buf[100];
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
cpid = fork();
if (cpid == 0) {
read(pipefd[0], &buf, 1);
cout << buf << " command received." << endl;
}
else {
cout << "Enter a command: " << endl;
cin >> buf;
cout << "buf: " << buf << endl;
size_t len = strlen(buf);
write(pipefd[1], &buf, len);
}
return 0;
}
Der Ausgang ist slighty Differnt obwohl sein nur
ein `Befehl empfing. anstelle von
ein Befehl erhalten.
E: Ich bin Antergos auf meinem PC und elementar auf meinem Laptop, auf beiden Systemen das Terminal urxvt
Ein gutes Protokoll ist nicht auf die Nachrichtenlänge angewiesen, da der Empfänger weniger als die Anzahl der Ziffern erhalten kann gesendet, um mit zu beginnen. Eine bessere Methode ist die Verwendung eines Trennzeichens. json ist ein gutes Beispiel für '{message}'. – alvits
@alvits Kommt ganz auf die Bedürfnisse des Protokolls an. Der Delimiter-Ansatz erfordert ein Lesemuster von GETTA-Byte GETTA-Byte GETTA Byte, Byte, Byte, um das Trennzeichen zu finden, und das ist möglicherweise nicht geeignet. Sie können den Eingabepuffer für eine Sache sorglos überlaufen. Die vorangestellte Länge ermöglicht es dem Empfänger, die Zeit im Voraus zu überprüfen und sicherzustellen, dass sie genügend Speicher haben, um die Nachricht zu verarbeiten und hoffentlich einen großen Lesevorgang zu machen. – user4581301
Ich stimme nicht zu. Deshalb gibt es den dritten Parameter für 'read()'. Dies ist der Schutz vor Pufferüberlauf. Der Absender darf länger senden als der Puffer halten kann. Der Empfänger ist dafür verantwortlich, alles über eine Schleife zu lesen, wenn der Puffer kürzer ist. – alvits