0

前提: ユーザーに 2 つのコマンドを要求する C++ プログラムを実装します。各入力文字列は、引数を使用できる UNIX コマンドである必要があります。たとえば、入力 1 を「ls -l」、入力 2 を「wc -l」とすることができます。次に、プログラムはパイプと 2 つの子プロセスを作成します。最初の子プロセスは、最初の入力で指定されたコマンドを実行します。標準出力ではなく、パイプに出力します。2 番目の子プロセスは、2 番目の入力で指定されたコマンドを実行します。標準入力ではなく、パイプから入力を受け取ります。親プロセスは 2 つの子プロセスが完了するのを待ってから、すべてを繰り返します。最初のコマンドとして「quit」を入力すると、実行が停止します。

プログラムはほぼ完成したと思いますが、ユーザー入力をパイプで実行する方法を理解するのに苦労しており、構文エラーが発生します。

これまでの私のコードは次のとおりです。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <cstring>
using namespace std;

int main() {
    //Declare Variables
    char first, second[80];
    int rs, pipefd[2];
    int pid1, pid2;
    char *command1[80], *command2[80];

    //Asking for the commands
    cout << "Please enter your first command(incl. args) or quit: ";
    cin >> first;

    //Do the program while the first answer isn't quit
    while(first[0] != 'quit') {

    //Copy first answer into first command
    strcpy(command1, ((char*)first);

    //Just skip to end of program if first command is quit
    cout << "Please enter your second command(incl. args): ";
    cin >> second;

    //Copy second answer into second command
    strcpy(command2, ((char*)first);

    //pipe
    rs = pipe(pipefd);
    //if pipe fails to be made
    if(rs == -1){
        perror("Fail to create a pipe");
        exit(EXIT_FAILURE);
    }

    //Fork for the two processes
    pid1 = fork();

    if (pid1 != 0){
    pid2 = fork();
}

    if(pid1 == -1){
        perror("Fail to create a pipe");
        exit(EXIT_FAILURE);
    }
        if(pid2 == -1){
        perror("Fail to create a pipe");
        exit(EXIT_FAILURE);
    }

        if (pid1 == 0) { // 1st child process   
        // close write end of pipe
        close(pipefd[0]);
        // duplicate
        dup2(pipefd[1], 1);
        //execute the input argument
        execvp(command1[0], command1);
    } 
                if (pid1 == 0) { // 2st child process   
        // close write end of pipe
        close(pipefd[0]);
        // duplicate
        dup2(pipefd[1], 1);
        //execute the input argument
        execvp(command2[0], command2);
    }

        else {  // parent process   
        // close read end of pipe
        close(pipefd[0]);
        // wait for child processes
        wait(&pid1);
        wait(&pid2);    
    }

    //Asking for the commands
    cout << "Please enter your first command(incl. args) or quit: ";
    cin >> first;

    }; //end of while()

return 0;
}

これは近い将来に予定されているため、ヘルプ/ヒントをいただければ幸いです。最終的にこの獣に取り組みたいと思います。

編集:取得したエラーの追加

In function int main()':
z1674058.cxx:26:33: error: expected ')' before ';' token
z1674058.cxx:33:33: error: expected ')' before ';' token
4

1 に答える 1