そこで、パイプと execl を使用して演算を行うプログラムを作成しました。パイプやさまざまなプロセスをデバッグする方法はわかりませんが、私が見ることができるのは、数値を読み取るパイプと関係があるはずです。したがって、これまでの私のセットアップでは、子が作成され、指定された操作に基づいて、パイプに書き込まれた値を計算するさまざまなプログラムに実行されます。結果を読み取る前に、値を子に書き込んだ後、親に待機または何かを実装する必要があるかどうかはわかりません。出力としてZを取得し続けます。
したがって、これは私が実行しているファイルの1つであり、他のファイルはまったく同じように見え、対応する操作を示しているだけです:
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
using namespace std;
main(int argc, char *argv[])
{
int x, y, z;
while (read(0, (char *)&x, sizeof(int)) &&
read(3, (char *)&y, sizeof(int))) {
z = x * y;
if (argc > 1)
cerr << "multiply: " << x << " * " << y << " = " << z << endl;
write(1, (char *)&z, sizeof(int));
}
}
これは私のコードで、実際に計算を行っていて、パイプが正しく設定されていると思います。時間を節約するために、パイプのセットアップについて少し説明します。子 0 -- パイプ 0 1 から読み取り、2 に書き込みます。子 1 はパイプ 2 と 3 から読み取り、4 に書き込みます。親は 0 1 3 に書き込み、4 から読み取ります。私のコード:
#include <iostream>
#include <fstream>
#include <unistd.h>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <sstream>
using namespace std;
const int MAX =21;
int pipes[MAX][2];
char operations[MAX];
int main()
{
int a=0;
int n;
fstream datafile;
pid_t pid;
string line;
datafile.open("data1.txt");
if(datafile)
{
string input;
getline(datafile, input);
for(int i=0; i< input.size(); i++)
{
if (input[i] == '*'|| input[i] == '/'||input[i] == '+'||input[i] == '-')
{
operations[a] = input[i];
a++;
}
}
n = (a);
for(int i =0; i<(2*n+1); i++)
pipe(pipes[i]);
for (int i=0; i <n; i++)
{
pid = fork();
if(pid == 0)
{
close(0);
dup(pipes[2*i][0]);
close(3);
dup(pipes[2*i+1][0]);
close(1);
dup(pipes[2*i+2][1]);
switch(operations[i])
{
case '+':
execl("add","add", NULL);
case '-':
execl("subtract","multiply", NULL);
case '*':
execl("multiply","multiply", NULL);
case '/':
execl("divide","divide", NULL);
}
cout<< "No match for operation!";
}
else if(pid <0)
cerr<<"Fork has failed";
}
int x, y, z;
for(int i=0; i<3; i++)
{
getline(datafile,line);
istringstream ins(line);
ins >> x >> y >> z;
write(0,(char *)&x, sizeof(x));
write(3,(char *)&z, sizeof(z));
write(1,(char *)&y, sizeof(y));
}
close(0);
close(3);
close(1);
}
else
cerr<<"Error reading file";
datafile.close();
int result;
while(read(pipes[2*n][1],(char *)&result,sizeof(result)))
cout<<result<<endl;
}
データファイルは次のようになります。
a * b * c
30 40 50
100 3 6