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. Nodejs - 複数の配列を扱う
- 2. PHP - 配列を扱う
- 3. 文字列の二重引用符を扱うPHPの関数
- 4. Devise.friendly_tokenの配列のような引数
- 5. PHPのチェックボックスの配列を扱う
- 6. 複数のベクトルを含む配列からの値を扱う
- 7. 配列値のインスタンスを扱う
- 8. 単一の配列値を扱う
- 9. 遅延オブジェクトの配列を扱う
- 10. 任意の配列を扱うF#
- 11. コマンドライン引数配列
- 12. 配列引数のデフォルト値
- 13. C++配列コンストラクタの引数
- 14. Expressフォームで入力配列を扱う?
- 15. C言語の動的関数の引数を扱う
- 16. 私のgolang variadic関数の引数を扱う方が良い
- 17. ロジックを持つ配列の配列を扱う関数の例は何でしょうか?
- 18. NumPy引数配列分割
- 19. 配列糸引き数
- 20. 配列数から配列数を引いた
- 21. オブザーバブルの配列に引数を渡す
- 22. 配列内のオブジェクトのように `int`を扱う方法
- 23. 配列のようなcoffeescriptの単一値を扱う方法
- 24. 3D numpy配列の引数を4D numpy配列に渡す
- 25. argparseとの関係を持つコマンドライン引数を扱うには?
- 26. jsonファイルのPythonプログラム引数の扱い
- 27. 配列からの引数のフィルタリング
- 28. Javascriptの配列引数の問題
- 29. JavaScript/jQuery - 異なるデータ構造を持つ複数の配列を扱う
- 30. 配列としてのHaskell printf引数
echoを使用する代わりに、基本的にargv配列のすべてを出力する別のプログラムを使用しました。私はいつもargv [0]がコマンド自体の名前(execvの最初のパラメータ)になると仮定しましたが、この場合はexecvを呼び出した後、argv [0]はそうではありませんでした。むしろそれはexecvの第二のパラメターでした。これを明確にすることはできますか? – Lucas
まあ、引数リストを 'execv'に渡したときに、' argv [0] 'にコマンドの名前を設定しましたか?第2引数 'execvp' *として渡す配列は、新しいプログラムでは' argv'になりますので、期待通りに設定する必要があります。 –
このコードはconstの正確性を損なう。私はむしろconst char * args [] = {...};を書くでしょう。 execvpのプロトタイプでは、argsの文字列を書き込み可能にする必要があります。 – user877329