2012-01-11 9 views
6

execvpを呼び出すと、たとえばexecvp(echo, b)となります。ここで、bはコマンドの引数の配列です。後でこの配列を変更すると以前に作成されたexecvp呼び出しに影響しますか?私がexecp(echo、b)を呼び出すと、bの内容の代わりに(null)が出力されます。なぜ誰かが正しい引数を渡すために必要なことを指摘できますか?execvpの引数配列を扱う?

答えて

12

exec()に電話した後、またはその親族の場合は、元のプログラムではが存在しません。はもう存在しません。つまり、実行されることはないので、そのプログラム内の何もがexec()呼び出しの後で何にも影響を与えることはありません。引数の配列を正しく作成していない可能性がありますか?ここexecvp()の迅速な作業例です:execvp() man pageから

#include <unistd.h> 

int main(void) 
{ 
    char *execArgs[] = { "echo", "Hello, World!", NULL }; 
    execvp("echo", execArgs); 

    return 0; 
} 

execv()execvp()、およびexecvpe()機能は、そのヌルで終わる文字列へのポインタの配列を提供新しいプログラムが利用できる引数リストを表します。規則の第1引数は、実行中のファイルに関連付けられたファイル名を指す必要があります。ポインターの配列は、NULLポインターで終了する必要があります。

一般的な間違いは、「最初の引数は、慣習上、実行されるファイルに関連付けられたファイル名を指す必要があります」ということです。これは、echoが "echo"をargv[0]としていることを確認する部分です。

+0

echoを使用する代わりに、基本的にargv配列のすべてを出力する別のプログラムを使用しました。私はいつもargv [0]がコマンド自体の名前(execvの最初のパラメータ)になると仮定しましたが、この場合はexecvを呼び出した後、argv [0]はそうではありませんでした。むしろそれはexecvの第二のパラメターでした。これを明確にすることはできますか? – Lucas

+0

まあ、引数リストを 'execv'に渡したときに、' argv [0] 'にコマンドの名前を設定しましたか?第2引数 'execvp' *として渡す配列は、新しいプログラムでは' argv'になりますので、期待通りに設定する必要があります。 –

+0

このコードはconstの正確性を損なう。私はむしろconst char * args [] = {...};を書くでしょう。 execvpのプロトタイプでは、argsの文字列を書き込み可能にする必要があります。 – user877329

0

execの呼び出し後、あなたのプログラムは新しいものと交換されることに注意してください。それはもはや実行されていないので、exec呼び出し後の同じプロセス内のコードは、実際には到達できません。

b配列がNULLで終了することは確かですか? execが正常に動作するには、最後の要素はNULLでなければなりません。また、最初のパラメータも "echo"(argv [0])に設定してください。

execlp("echo", "echo", "something", NULL); 

を試してみてくださいところで、execlpは、あなたが望むようにあなたに多くのパラメータを渡すことができ、もう少し使い心地です。

+1

これは 'execvp()'の仕組みではありません。 –

+0

私が理解しているところでは、execvpはコマンドとargv配列を取ります。 execvp呼び出し時には、コマンドとargv配列の両方がNULLではありませんでした。しかし、エコーが呼び出されたときには引数がないように見えました。 – Lucas

+0

申し訳ありませんが、タイプミス 'execlp' ... –

関連する問題