ユースケース:
プログラム名を使用して、プログラムの動作を変更できます。
たとえば、実際のバイナリへのシンボリックリンクを作成できます。
この手法が使用される有名な例の1つは、1つのバイナリと多くのシンボリックリンクのみをインストールするbusyboxプロジェクトです。(ls、cp、mvなど)。ターゲットは小さな組み込みデバイスであるため、ストレージスペースを節約するためにそれを行っています。
これはsetarch
、util-linuxからも使用されます。
$ ls -l /usr/bin/ | grep setarch
lrwxrwxrwx 1 root root 7 2015-11-05 02:15 i386 -> setarch
lrwxrwxrwx 1 root root 7 2015-11-05 02:15 linux32 -> setarch
lrwxrwxrwx 1 root root 7 2015-11-05 02:15 linux64 -> setarch
-rwxr-xr-x 1 root root 14680 2015-10-22 16:54 setarch
lrwxrwxrwx 1 root root 7 2015-11-05 02:15 x86_64 -> setarch
ここでは、基本的にこの手法を使用して、多くの重複するソースファイルを回避したり、ソースをより読みやすくしたりしています。
別のユースケースは、実行時にいくつかのモジュールまたはデータをロードする必要があるプログラムです。プログラムパスがあると、プログラムの場所に関連するパスからモジュールをロードできます。
さらに、多くのプログラムはプログラム名を含むエラーメッセージを出力します。
なぜ:
- POSIX規則(
man 3p execve
)であるため:
argvは、新しいプログラムに渡される引数文字列の配列です。慣例により、これらの文字列の最初には、実行中のファイルに関連付けられたファイル名が含まれている必要があります。
- C標準(少なくともC99およびC11):
argcの値がゼロより大きい場合、argv [0]が指す文字列はプログラム名を表します。プログラム名がホスト環境から利用できない場合、argv [0] [0]はヌル文字でなければなりません。
C標準では、「ファイル名」ではなく「プログラム名」と表示されています。