0

私がやろうとしているのは、親によって生成された乱数を送信して子に送信し、子に「sort -nr」を実行してから、ソートされた数値を親に送り返すことです。私はこの質問がすでに尋ねられ、ここで私のものとかなり似ていることを発見しました: how to redirect output of "sort" program from child to parent , そして私はそれを機能させるためにそれが言ったことすべてをやったと思いましたが、私はできません並べ替えを実際に行うため。エラーが出るかどうかも確認しましたが、何も得られませんでした。

両方のパイプは同じ番号を送受信しますが、ソートされて出力されることはありません。私は何が欠けていますか?

int pipe1[2], pipe2[2];
pid_t childID;

if (pipe(pipe1) < 0 || pipe(pipe2) < 0) {
    perror("pipe");
    exit(EXIT_FAILURE);
    }

childID = fork();

if (childID < 0) {      
//Child Process Failure
    perror("fork");
    exit(EXIT_FAILURE);
}
else if (childID == 0){                                 
//Child Process Instructions
    cout << "Sent Numbers: " << endl;
    //Closes Unused Pipes
    close(pipe1[WRITE_END]);
    close(pipe2[READ_END]);

    //Dups Over the Others, then closes them
    dup2(pipe1[READ_END], STDIN_FILENO);
    close(pipe1[READ_END]);
    dup2(pipe2[WRITE_END], STDOUT_FILENO);
    close(pipe2[WRITE_END]);

    int fail = execlp("sort", "sort", "-nr", (char *)NULL);
    cout << fail << endl;
    }
else {                                                  
    //Parent Process Instructions
    //Close Unused Pipes
    close(pipe1[READ_END]);
    close(pipe2[WRITE_END]);

    srand(randSeed);
    cout << "Random Numbers: " << endl;
    for (int i = 0; i < nWorkers; i++){     
    //Generate nWorker numbers, then Write
        randNumbers[i] = rand() % (sleepMax - sleepMin + 1) + sleepMin;
        write(pipe1[WRITE_END], &randNumbers[i], sizeof(randNumbers[i]));
        cout << randNumbers[i] << endl;
    }
    close(pipe1[WRITE_END]);
    wait(NULL);
    cout << "SORTED NUMBERS:" << endl;

    double sortedNumbers[nWorkers];
    int n;

    for(int k = 0; k < nWorkers; k++) {
    n = read(pipe2[READ_END], &sortedNumbers[k], sizeof(sortedNumbers[k]));
    cout << sortedNumbers[k] << ", " << n << endl;
    }
}
4

1 に答える 1

0

sort(1)は、入力が生の 2 進数ではなく、ASCII 文字列であることを期待しています。でデータを渡すと、write(2)数値の生のバイナリ表現がパイプに書き出されますが、これはあなたが望むものではありません。数値を文字列表現に変換する必要があります。

これを行う 1 つの方法は、パイプの上に stdio ストリームを開くことfdopen(3)です。fprintf次に、フォーマットされたデータを書き込むために使用できます。

FILE *childInput = fdopen(pipe1[WRITE_END], "w");
if (childInput == NULL) { /* Handle error */ }
for (...)
{
    ...
    fprintf(childInput, "%d\n", randNumbers[i]);
}
fclose(childInput);

同様に、子からの出力を読み返すときにも同じことを行う必要があります。

FILE *childOutput = fdopen(pipe2[READ_END], "r");
if (childOutput == NULL) { /* Handle error */ }
while (fscanf(childOutput, "%d", &sortedNubers[i]) == 1)
{
    ...
}
fclose(childOutput);
于 2013-03-13T22:04:03.013 に答える