argvにプログラム名が含まれているのはなぜですか?

argvにプログラム名が含まれているのはなぜですか?

一般的なUnix / Linuxプログラムは、コマンドライン入力を引数数(int argc)と引数ベクトル(char *argv[])として受け入れます。最初の要素argvはプログラム名で、その後に実際のパラメータが続きます。

プログラム名が実行可能ファイルに引数として渡されるのはなぜですか?自分の名前を使用するプログラムの例はありますか(多分exec状況に応じて)?

ベストアンサー1

まず、必ずしもargv[0]プログラム名である必要はないことに注意してください。これは、呼び出し側がargv[0]システムコールに入れることですexecve(例を参照)。スタックオーバーフローに関するこの質問)。 (他のすべてのバリエーションはexecシステムコールではなくインターフェイスですexecve。)

たとえば、次の状況を想定します(使用execl)。

execl("/var/tmp/mybackdoor", "top", NULL);

/var/tmp/mybackdoorは実行されますが、argv[0]に設定されますtop。これはpsまたは(実際)top表示されます。バラよりこの回答詳しくはU&L SEをご覧ください。

すべてを除いて:/procargv[0]利点は何ですか?

  • 一部のプログラムは、呼び出される名前に基づいて名前が付けられます(通常はシンボルまたはハードリンクを介して)。BusyBoxユーティリティ;この質問に対する他の答えには、より多くの例があります。
  • さらに、syslogを介して記録されたサービス、デーモン、および他のプログラムはしばしばログエントリに名前を追加するため、イベント追跡はほとんど不可能です。

おすすめ記事