3

execv()/ bin/からc++プログラムの「ls」、「pwd」、「echo」などのコマンドを実行するために使用していますが、argv[0]でどのような値を指定する必要があるのか​​疑問に思っています。

const char * path = getPath();
char ** argv = getArgs();

execv(path,argv);
4

3 に答える 3

12

argv[0]プログラム名になっています。プログラムのmain関数に渡されます。一部のプログラムは、文字列argv[0]が何であるかによって動作を区別します。たとえば、GNUシェルは、の代わりにをbash使用して呼び出された場合、その機能の一部を無効にします。に渡すのと同じ値を指定するのが最適です。shbashpath

Linuxではargv[0]、ユーティリティによって表示されるプロセス名topです(おそらくエントリの読み取りから取得されます/proc/

于 2010-03-02T15:54:47.307 に答える
5

argv [0]は、実行するコマンドのフルパスである必要があります。

于 2010-03-02T15:49:05.650 に答える
2

これはあなたが探している答えではないことを私は知っていますが、あなたがこれをしている特定の理由がありますか?私が尋ねる理由は、人々が通常実行するアクションのすべてではないにしても、WindowsまたはUnixのライブラリで利用可能であり、より安全で高速であり、状況エラーに悩まされる可能性が低いsystem()ためです。つまり、たとえば、変更が行われ、突然コードが機能しなくなった場合です。execv()PATH

文字列の全部または一部を渡して実行している場合は、損害を与える可能性のあるコマンドを入力することで、システムにアクセスできるユーザーに自分自身を開放したままにします。たとえば、を使用してファイル検索を実装しfind /home -name、ユーザーが次のように入力したとします。

"%" -exec rm {} \;

痛い!

于 2010-03-02T16:05:55.647 に答える