execvp
を呼び出すと、たとえばexecvp(echo, b)
となります。ここで、bはコマンドの引数の配列です。後でこの配列を変更すると以前に作成されたexecvp呼び出しに影響しますか?私がexecp(echo、b)を呼び出すと、bの内容の代わりに(null)が出力されます。なぜ誰かが正しい引数を渡すために必要なことを指摘できますか?execvpの引数配列を扱う?
答えて
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]
としていることを確認する部分です。
exec
の呼び出し後、あなたのプログラムは新しいものと交換されることに注意してください。それはもはや実行されていないので、exec
呼び出し後の同じプロセス内のコードは、実際には到達できません。
b配列がNULLで終了することは確かですか? execが正常に動作するには、最後の要素はNULLでなければなりません。また、最初のパラメータも "echo"(argv [0])に設定してください。
は
execlp("echo", "echo", "something", NULL);
を試してみてくださいところで、execlp
は、あなたが望むようにあなたに多くのパラメータを渡すことができ、もう少し使い心地です。
これは 'execvp()'の仕組みではありません。 –
私が理解しているところでは、execvpはコマンドとargv配列を取ります。 execvp呼び出し時には、コマンドとargv配列の両方がNULLではありませんでした。しかし、エコーが呼び出されたときには引数がないように見えました。 – Lucas
申し訳ありませんが、タイプミス 'execlp' ... –
- 1. PHP - 配列を扱う
- 2. コマンドライン引数配列
- 3. PHPのチェックボックスの配列を扱う
- 4. 配列引数のデフォルト値
- 5. 遅延オブジェクトの配列を扱う
- 6. 単一の配列値を扱う
- 7. 配列値のインスタンスを扱う
- 8. Expressフォームで入力配列を扱う?
- 9. 配列数から配列数を引いた
- 10. Javascriptの配列引数の問題
- 11. 配列サイズがVBAで配列引数を渡す制限
- 12. 配列としてのHaskell printf引数
- 13. Haskell:配列引数の再帰
- 14. 配列内のオブジェクトのように `int`を扱う方法
- 15. 配列のようなcoffeescriptの単一値を扱う方法
- 16. 複数の引数または単一の配列引数を許可する
- 17. フラッシュ:残りの引数と配列:どのように?
- 18. jsonファイルのPythonプログラム引数の扱い
- 19. iphoneのplistで配列の辞書を扱う方法
- 20. 構造体の2次元配列を扱う際のセグメンテーションフォールト
- 21. 構造体の配列を扱う際のセグメンテーションエラー
- 22. 配列を別の引数文字列に変換する
- 23. 配列のurl引数とURLを引数で取得する方法
- 24. clojureでjava可変長引数を扱うには?
- 25. 配列を独立した関数の引数にする - howto?
- 26. 関数の引数で配列を参照する方法
- 27. Firebaseで空の配列を扱うには?
- 28. Android:大規模な配列を扱うためのベストプラクティス
- 29. std :: stringとchar []の両方の引数を扱う特殊なテンプレートメンバー関数
- 30. java.lang.IllegalArgumentExceptionが:引数の型の不一致文字列配列
echoを使用する代わりに、基本的にargv配列のすべてを出力する別のプログラムを使用しました。私はいつもargv [0]がコマンド自体の名前(execvの最初のパラメータ)になると仮定しましたが、この場合はexecvを呼び出した後、argv [0]はそうではありませんでした。むしろそれはexecvの第二のパラメターでした。これを明確にすることはできますか? – Lucas
まあ、引数リストを 'execv'に渡したときに、' argv [0] 'にコマンドの名前を設定しましたか?第2引数 'execvp' *として渡す配列は、新しいプログラムでは' argv'になりますので、期待通りに設定する必要があります。 –
このコードはconstの正確性を損なう。私はむしろconst char * args [] = {...};を書くでしょう。 execvpのプロトタイプでは、argsの文字列を書き込み可能にする必要があります。 – user877329