乱数の列を取り除くことができるパイプを作成しようとしています。親と子に分割し、乱数を生成し、子の場合はパイプに書き込み、親の場合は読み込みます。私はこれが近いと感じますが、私の出力はナンセンスです。誰かがパイプが何をしているのかを説明して、この行動をどのように実行するかを正しい方向に向けることができますか?文字列でパイプを使用する
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream> /* c++ I/O headers */
#include <string.h>
#include<math.h>
using namespace std;
int main(int argc, char *argv[]) {
//Get the number of random numbers
int numberOfRandomNumbers = stoi(argv[1]);
//char childPipe[200], parentPipe[200]; //pipes to hold numbers
int pid, index, count; //counters
int pipe1[2]; // main pipe
int xyz = pipe(pipe1); //perform the pipe
string stringOfRandomNumbers = "";
pid = fork(); //fork the process
//check for errors-------------------------------------------
if(xyz < 0 || pid < 0){
//break
cout << "Error" << endl;
return 0;
}
//Check process----------------------------------------------
if (pid == 0) { /* child */
srand(pid+4); //seed the random
int randNum;
//Start building the string
stringOfRandomNumbers = "Child, ID = ";
stringOfRandomNumbers += to_string(pid);
stringOfRandomNumbers += ", Random numbers: >";
//Now generate random numbers
for (index = 0; index < numberOfRandomNumbers; index++) {
randNum = rand() % 100;
//add to string.....
if(index == (numberOfRandomNumbers - 1)){
//last one
stringOfRandomNumbers += (to_string(randNum) + "<");
}
else{
stringOfRandomNumbers = stringOfRandomNumbers + (to_string(randNum) + ", ");
}
}
cout << endl << stringOfRandomNumbers << " length = " << stringOfRandomNumbers.length() << endl;
close(pipe1[0]); //don't read off of pipe
write(pipe1[1], stringOfRandomNumbers, stringOfRandomNumbers.length());
close(pipe1[1]); //done
}
else { /* parent */
// Now generate random numbers
srand(pid+8);
int randNum;
//Start the string
stringOfRandomNumbers = "Parent, ID = ";
stringOfRandomNumbers += to_string(pid);
stringOfRandomNumbers += ", Random numbers: >";
//Now generate random numbers
for (index = 0; index < numberOfRandomNumbers; index++) {
randNum = rand() % 100;
//Add to string.....
if(index == (numberOfRandomNumbers - 1)){
//last one
stringOfRandomNumbers += (to_string(randNum) + "<");
}
else{
stringOfRandomNumbers = stringOfRandomNumbers + (to_string(randNum) + ", ");
}
}
close (pipe1[1]);
count = read(pipe1[0], stringOfRandomNumbers, stringOfRandomNumbers.length());
for (index=0; index < count; index++){
cout << stringOfRandomNumbers[index] << endl;
}
close (pipe1[0]); //done
}
}
また、この件に関する余分な資料もあります。 – MattCucco
なぜ親に乱数を生成していますか?親で読み取り呼び出しを行うときは、バッファと、そのバッファに読み込む最大長を指定する必要があります。 –
読み取り呼び出しに関する文書を参照してください。 'std :: string'を引数として渡すことができるとは思いません。 –