`execve()` の `argv[0]` は `pathname` 引数のデフォルト名部分と同じでなければなりませんか?

`execve()` の `argv[0]` は `pathname` 引数のデフォルト名部分と同じでなければなりませんか?

存在する

#include <unistd.h>
int execve(const char * pathname , char *const  argv [], char *const  envp []);

argv [0]ofは新しいプログラムの主な機能execveに対応するため、通常は引数のデフォルト名部分と同じです。これは私たちが常に従うべき要件ですか?argv[0]pathname

プログラムファイルを別の値で呼び出すことができる場合argv[0]、この規則/慣例はプログラムファイルを呼び出し、特定の値を持つことを望むときにそのargv[0]main()と呼ばれるプログラムファイルへのシンボリックリンクを生成し、argv[0]シンボリックリンク呼び出しプログラム?それとも必ずしもそうではありませんか?例えば、「argvにプログラム名が含まれているのはなぜですか?」への答えです。説明する

argv[0]その場合、BashはPOSIXモードで実行されますsh。で始まると、argv[0]ログインシェルとして実行されます-

これはどういう意味ですか?

  • POSIXモードでbashを呼び出すには、シンボリックリンクを作成して/path/to/sh文字列をポイントして/bin/bashbashを呼び出す必要があります。これが文字列を指すよりも優れており、問題になりませんか?execve("/path/to/sh", argv, ...)argv[0]"sh"execve("/bin/bash", argv, ...)argv[1]"--posix"argv[0]

  • bashをログインシェルとして呼び出すには、シンボリックリンクを作成して/path/to/-文字列?をポイントして/bin/bashbashを呼び出す必要があります。この方法は文字列の位置を指すよりも好ましく、重要ではありませんか?execve("/path/to/-", argv, ...)argv[0]"-"execve("/bin/bash", argv, ...)argv[1]"--login"argv[0]

argv [0]いつ役に立ちますかexecveいいえ、同じです。pathnameパラメータのデフォルト名の一部として?

答え1

あなたがリンクした質問に対する答えは次のとおりです。

まず、必ずしもargv[0]プログラム名である必要はないことに注意してください。

これは主な問題を解決します。

リリース計画に関するさまざまな質問は、誤解に由来するようです。名前以外の値に設定されたプログラムを実行するためにリンク(シンボルリンクまたはハードリンク)を使用する必要はありません。argv[0]与えられた配列を制御できるはずですexecveloginシェルの起動時に実行する作業は次のとおりです。-in プレフィックスが付きます。argv[0]

argv[0]Bashは起動時にPOSIXモードで起動するshため/bin/sh--posix

同じ推論が-ログインシェルにも適用されます。このルールは、--loginオプションがサポートされているかどうかに関係なく、すべてのシェルに適用されます。

ログインユースケースは、argv[0]プログラム名と同じではない便利な例です。

関連情報