28

execvpは次のように定義されます。

int execvp(const char *file, char *const argv[]);

これにより、このようなコードは使用できなくなります。

const char* argv[] = {"/bin/my", "command", "here", NULL};
execvp(argv[0], argv);

これは偶然の脱落でしたか?これを回避してconst_castするのは安全ですか?または、一部のexecvp実装は、実際にそのメモリに落書きしますか?

4

2 に答える 2

9

POSIX仕様によると(http://pubs.opengroup.org/onlinepubs/009604499/functions/exec.html):

ポインタの配列argv[]envp[]それらの配列が指す文字列は、プロセスイメージを置き換えた結果を除いて、exec関数の1つを呼び出しても変更できません。

const行方不明(または置き忘れ)は単に歴史的な奇妙なことだと思います。

于 2012-05-04T21:53:16.773 に答える
-1

私はこれと同じ状況に遭遇しました。execvp()はchar *const2番目のパラメーターとしてを持っているので、それはcharへの定数ポインターを受け入れることを意味します。したがって、ポインタ文字を渡すと、ポインタ文字を定数ポインタの文字にキャストできます。だから、それを宣言する代わりに

const char* argv[] = {"/bin/my", "command", "here", NULL};

試す

char* argv[] = {"/bin/my", "command", "here", NULL};

そしてそれは問題なく受け入れargv[]ます。

于 2017-03-06T15:19:55.793 に答える