1

かなり検索しましたが、まだこれに対する答えがありません。ユーザーに目的のコマンドを尋ねることで他のプロセスを作成するプログラムがあり、次に execlp を使用してこの新しいプロセスを開きます。親プロセスがコマンドが実行されたかどうか、または受信したコマンドが存在しないかどうかを確認する簡単な方法があるかどうかを知りたかったのです。

次のコードがあります。

if (executarComando(comando) != OK)
   fprintf(stderr,"Nao foi possivel executar esse comando. ");

executarComando は次のとおりです。

int executarComando(char* cmd) {
if ( execlp("xterm", "xterm", "-hold", "-e", cmd, NULL) == ERROR) // error
    return ERROR;
return OK;
}
4

2 に答える 2

1

あなたの問題は、execlp常に成功することです。it's runningxtermであり、シェルに渡すコマンドではありませんxterm。プログラムとこのシェルの間にある種の通信チャネルを追加して、成功または失敗を伝えられるようにする必要があります。コマンドを次のように置き換えるようなことをします

( command ) 99>&- ; echo $? >&99

次に、 fork する前にパイプを開き、 を呼び出しexeclp、子で使用dup2して、パイプの書き込み終了に対応する 99 番のファイル記述子を作成します。これで、パイプを介してコマンドの終了ステータスを読み取ることができます。

xtermすべてのファイル記述子が閉じられないことを願っています。mkfifoそうしないと運が悪くなり、同じ結果を得るには、ファイルシステムのどこかに一時的な fifo を作成する必要があります ( 経由)。

99 という数字は任意であることに注意してください。0、1、または 2 以外の値が機能するはずです。

于 2012-04-16T00:44:41.307 に答える
1

簡単な方法はありません。頻繁に使用される規則は、 ed の子が失敗した特定のケースでエラーおよび(または)fork()を報告することであり、ほとんどのコマンドはそれを独自の失敗モードに使用することを避けます。exit(-1)exit(255)exec()

于 2012-04-15T21:49:11.360 に答える