0

C ++でパイプを使用してシェルを実装しようとしています。コマンドは機能していますが、パイプが関与すると、機能が停止します。私が何を意味するかをお見せします。コードは次のとおりです。

    int inPipe[2];
    int outPipe[2];
    pipe(inPipe);
    pipe(outPipe);

    int std_in = dup(0);
    int std_out = dup(1);
    std::for_each(cmds.begin(), cmds.end(), [&](Command command){
        //printf("Executing [%s] \n", command.args[0].c_str());
        auto pid = fork();
        if(pid==-1) {
            std::cerr << "Could not fork\n";
            return;
        }
        if (pid==0) {
            //std::cout << "Child\n";

            if(command.inFile == "none") {
                printf("In, none.\n");
                dup2(std_in, 0);
                close(std_in);
            }
            else if(command.inFile == "pipe") {
                printf("In, pipe.\n");
                dup2(inPipe[0], 0);
                close(inPipe[0]);
            }

            if(command.outFile == "none") {
                printf("Out, none.\n");
                dup2(std_out, 1);
                close(std_out);
            }
            else if(command.outFile == "pipe") {
                printf("out, pipe.\n");
                dup2(outPipe[1], 1);
                close(outPipe[1]);
            }

            const char* name = command.args[0].c_str();
            char** args = new char*[command.args.size()];
            for(int i=0; i<command.args.size(); i++) {
                args[i] = new char[command.args[i].size()];
                strcpy(args[i], command.args[i].c_str());
            }

            execvp(name, args);
            exit(errno);
        }
        else {
            //std::cout << "Parent\n";
            int status;
            auto before = std::chrono::system_clock::now();

            dup2(outPipe[0], inPipe[0]);
            dup2(outPipe[1], inPipe[1]);
            close(outPipe[0]);
            close(outPipe[1]);
            pipe(outPipe);

            waitpid(pid, &status, 0);


            auto after = std::chrono::system_clock::now();
            std::chrono::duration<double> ptime = after-before;
            elapsed_time = elapsed_time + ptime.count();
        }
    });

単純な「ls」などの単一パイプ コマンドを実行すると、正常に動作します。ただし、 ls | を使用すると ソートすると、次のエラー メッセージが表示されます。

ls: cannot access : No such file or directory

そして、そこから出るまでハングします。パイプを何らかの形で(パイプを閉じないで)誤って処理したことがハングアップの原因だと思いますが、それをどこに何回入れるかわかりません。なんとなく。私はこれらの関数 (dup2、fork、execp、pipe など) のほとんどすべてに慣れていないので、推測とチェックは 6 ラウンドのロシアン ルーレットに似ていると感じています。

とにかく、どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

0

変数名と引数を確認してください。これらの値の 1 つが NULL である可能性があります

于 2014-02-20T03:55:25.860 に答える