所以我目前正在做一個任務,並在我的筆記本電腦上工作正常,但在我的電腦上輸出是亂碼。從兩個系統上的相同程序的C++不同的輸出
輸入一個命令:
一個
輸入一個命令:接收
a'Zéÿ命令。
忽略我搞砸了輸出爲什麼在輸出中有'Zéÿ?
在我的筆記本電腦上,代碼正常工作。
這裏是一個小樣本代碼:
#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;
}
輸出是略低不同的充雖然接受了它的剛
一個`命令。而不是
收到一個命令。
E:我用我的筆記本電腦在我的電腦和基本antergos,兩個系統上的終端是urxvt
一個好的協議不是依賴於消息長度,因爲接收者可能會收到少於您的位數發送開始。更好的方法是使用分隔符。 json是使用'{message}'的一個很好的例子。 – alvits
@alvits完全取決於協議的需求。定界符方法需要getta-byte getta-byte getta字節,字節,字節的讀取模式來查找分隔符,這可能不合適。您可以不小心超出輸入緩衝區的一件事。前置長度允許接收機提前檢查並確保它們具有足夠的存儲空間來處理該消息並且希望能夠進行一次大的讀取。 – user4581301
我不同意。這就是爲什麼'read()'有第三個參數。這是緩衝區溢出的保障。允許發送者發送比緩衝區可容納更長的時間。如果緩衝區較短,收件人負責通過循環讀取所有內容。 – alvits