現在、私は割り当てを行っていますが、ノートパソコンではうまく動作しますが、PC上では出力がばかげています。2つのシステムで同じプログラムから出力されるC++の出力が異なります
のコマンドを入力します。
は、次のコマンドを入力します。
a'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;
}
出力はslighty differntあります。
の代わりにコマンドを受信しました。
E:私は端末がurxvt
受信者が数字の桁数よりも少なく受信する可能性があるため、メッセージの長さに依存しないプロトコルです最初に送られた。より良い方法は、デリミタを使用することです。 jsonは '{message} 'を使った良い例です。 – alvits
@alvits完全にプロトコルの必要性に依存します。デリミタのアプローチでは、区切り文字を見つけるためにgetta-byte getta-byte gettaバイト、バイト、バイトの読み込みパターンが必要ですが、これは適切ではない可能性があります。あなたは不注意に入力バッファをあふれさせることがあります。先頭に長さを付けると、受信者は事前に確認し、メッセージを処理するのに十分な記憶域があることを確認し、うまくいけば1つ大きな読み取りを行うことができます。 – user4581301
私は同意しません。そのため、 'read()'の第3引数があります。これは、バッファオーバーランの保護手段です。送信者は、バッファが保持できる以上の長さの送信を許可されます。受信者はバッファが短ければループを介してすべてを読む責任があります。 – alvits