1

親 (GUI) プロセスが子プロセスの stdout/stderr 出力を読み取り、そのコマンドを子プロセスで実行するために forkpty() および execvp() を呼び出して、ユーザーからシェル コマンドを取得する GUI C++ プログラムがあります。 GUI に表示します。

これはすべてうまく機能します (Linux および MacOS/X で)。たとえば、ユーザーが「ls -l /foo」と入力すると、GUI は /foo フォルダーの内容を表示します。

ただし、出力リダイレクトなどの bash の詳細は処理されません。たとえば、ユーザーが「echo bar > /foo/bar.txt」と入力すると、子プロセスはテキスト「bar」をファイル「/ foo/bar.txt".

おそらくこれは、execvp() が実行可能コマンド「echo」を直接実行しているためであり、/bin/bash を実行してユーザーのコマンドをマッサージ/前処理に渡す代わりに実行されているためです。

私の質問は、ユーザーが bash プロンプトで文字列を入力したかのようにシステムを正確に動作させるために、使用する正しい子プロセス呼び出しは何ですか? /bin/bash -c the_string_the_user_entered のように、ユーザーのコマンドを /bin/bash 呼び出しでラップしようとしましたが、うまくいかないようでした。ヒントはありますか?

ps system() を呼び出すだけでは、子プロセスが終了するまで GUI がブロックされ、一部の子プロセスが長時間終了しない可能性があるため、適切なオプションではありません (存在する場合)。

4

1 に答える 1

1

シェルに I/O リダイレクションを実行させたい場合は、I/O リダイレクションを実行するようにシェルを呼び出す必要があります。

char *args[4];
args[0] = "bash";
args[1] = "-c";
args[2] = ...string containing command line with I/O redirection...;
args[4] = 0;

execv("/bin/bash", args);

execvp()からへの変更に注意してくださいexecv()。シェルがどこにあるか知っている - 少なくとも、私はそれに絶対パスを与えた - そのため、パス検索はもはや関係ありません。

于 2010-05-07T20:48:12.787 に答える