execv()
/ bin/からc++プログラムの「ls」、「pwd」、「echo」などのコマンドを実行するために使用していますが、argv[0]でどのような値を指定する必要があるのか疑問に思っています。
const char * path = getPath();
char ** argv = getArgs();
execv(path,argv);
execv()
/ bin/からc++プログラムの「ls」、「pwd」、「echo」などのコマンドを実行するために使用していますが、argv[0]でどのような値を指定する必要があるのか疑問に思っています。
const char * path = getPath();
char ** argv = getArgs();
execv(path,argv);
argv[0]
プログラム名になっています。プログラムのmain
関数に渡されます。一部のプログラムは、文字列argv[0]
が何であるかによって動作を区別します。たとえば、GNUシェルは、の代わりにをbash
使用して呼び出された場合、その機能の一部を無効にします。に渡すのと同じ値を指定するのが最適です。sh
bash
path
Linuxではargv[0]
、ユーティリティによって表示されるプロセス名top
です(おそらくエントリの読み取りから取得されます/proc/
)
argv [0]は、実行するコマンドのフルパスである必要があります。
これはあなたが探している答えではないことを私は知っていますが、あなたがこれをしている特定の理由がありますか?私が尋ねる理由は、人々が通常実行するアクションのすべてではないにしても、WindowsまたはUnixのライブラリで利用可能であり、より安全で高速であり、状況エラーに悩まされる可能性が低いsystem()
ためです。つまり、たとえば、変更が行われ、突然コードが機能しなくなった場合です。execv()
PATH
文字列の全部または一部を渡して実行している場合は、損害を与える可能性のあるコマンドを入力することで、システムにアクセスできるユーザーに自分自身を開放したままにします。たとえば、を使用してファイル検索を実装しfind /home -name
、ユーザーが次のように入力したとします。
"%" -exec rm {} \;
痛い!