2012-04-15 3 views
1

私はかなり多くを検索しましたが、私はまだ答えがありません。ユーザーに希望のコマンドを尋ねて他のプロセスを作成するプログラムがあり、execlpを使ってこの新しいプロセスを開きます。私は、親プロセスがコマンドが実行されたかどうか、または受信したコマンドが存在しないかどうかを調べる簡単な方法があるかどうかを知りたがっています。execlp()に与えられたコマンドが存在するかどうかを知る方法?

私は、次のコードを持っている:executarComandoがある

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

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

答えて

1

あなたの問題は、あなたのexeclpが常に成功することです。 xtermを実行しています。シェルに渡すコマンドではなく、xtermが実行されています。成功と失敗を通信できるように、プログラムとこのシェルの間に何らかの種類の通信チャネルを追加する必要があります。私はその後、execlpを呼び出すためにフォークの前にパイプを開く

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

でコマンドを交換するような何かを、と子どもに、パイプの書き込み側に対応するファイルディスクリプタ番号99として作成するdup2を使用します。これで、パイプを介してコマンドの終了ステータスを読み取ることができます。

ちょうどxtermがあなたのすべてのファイル記述子を閉じないようにします。それ以外の場合は、運が悪いので、同じ結果を得るには、一時的なFIFO(mkfifo経由)をファイルシステムのどこかに作成する必要があります。

数字99は任意であったことに注意してください。 0,1、または2以外のものは動作するはずです。

+0

私はパイプについてまだ読んでいない、あなたはあなたの交換が何を説明することができますか? –

1

全く些細な方法はありませんが。よく使われる規約では、exec()が失敗した特定のケースではexit(-1)(またはexit(255))というエラーが報告され、ほとんどのコマンドは独自の障害モードでそのエラーを使用しないようにしています。

+0

私はxtermを使っているので、execlpは決して失敗しません。xtermを使って別のシェルを作成し、そのシェルにコマンドが存在しないと言います。 –

+0

これはまだ同じことですが、レベルバックの1つです。競合状態や潜在的な失敗モードがなくても、確実にチェックすることはできません(例えば、 'execve()'が 'ENOEXEC'や' ETXTBSY'を得ることはできません実際に 'execve()'を実行します)。 – geekosaur

関連する問題