2

以下を機能させるには助けが必要です。C ++からbashプロセスを開始する必要があります。このbashプロセスは、stdinからの入力を受け入れ、通常どおりstdoutに出力する必要があります。

別のプロセスから、上記のように実際に bash で実行される stdin にコマンドを書き込む必要があります。次に、stdout からの結果に興味があります。

これは私がこれまでに試したことですが、出力はまったく意味がありません...

        if (pipe(pipeBashShell)) {
            fprintf(stderr, "Pipe error!\n");
            exit(1);
        }

        if ((pipePId = fork()) == -1) {
            fprintf(stderr, "Fork error. Exiting.\n"); /* something went wrong */
            exit(1);
        }

        if (pipePId == 0) { //this is the child process
            dup2(pipeBashShell[0], STDIN_FILENO);
            dup2(pipeBashShell[1], STDOUT_FILENO);
            dup2(pipeBashShell[1], STDERR_FILENO);

            static char* bash[] = {"/bin/bash", "-i", NULL};
            if (execv(*bash, bash) == -1) {
                fprintf(stderr, "execv Error!");
                exit(1);
            }
            exit(0);
        } else {
            char buf[512];
            memset(buf, 0x00, sizeof(buf));
            sprintf(buf, "ls\n");
            int byteswritten = write(pipeBashShell[1], buf, strlen(buf));
            int bytesRead = read(pipeBashShell[0], buf, sizeof(buf));

            write(STDOUT_FILENO, buf, strlen(buf));
            exit(0);
        }

.

上記の結果の出力は次のとおりです。

' (メイン) bash:: コマンドが見つかりません gerhard@gerhard-work-pc:~/workspaces/si/si$ gerhard orkspaces/si/si$ gerhard@ gerhard-work-pc:~/workspa ....

bash に送信しようとしているコマンドは「ls」です。これにより、ディレクトリの一覧が表示されるはずです。

ここで何か不足していますか?

4

1 に答える 1

4

1つのパイプ(両端が2つ)を作成し、それを双方向通信(メインプロセスからbashへ、またはその逆)に使用しようとしています。そのためには2本の別々のパイプが必要です。

ファイル記述子を接続する方法により、bashはそれ自体と通信します。つまり、プロンプトを検出できないコマンドとして解釈し、エラーメッセージを後続のコマンドとして解釈します。

編集:

正しい設定は次のように機能します。

  1. 2本のパイプを準備します。

    int parent2child[2], child2parent[2];
    pipe(parent2child);
    pipe(child2parent);
    
  2. fork()

  3. 親プロセス:

    close(parent2child[0]);
    close(child2parent[1]);
    // write to parent2child[1], read from child2parent[0]
    
  4. 子プロセスで:

    close(parent2child[1]);
    close(child2parent[0]);
    dup2(parent2child[0], STDIN_FILENO);
    dup2(child2parent[1], STDOUT_FILENO);
    
于 2012-08-24T11:57:16.890 に答える