所以我目前正在做一个任务,并在我的笔记本电脑上工作正常,但在我的电脑上输出是乱码。从两个系统上的相同程序的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