K&Rの本には、次のような質問があります。
呼び出された名前に応じて、大文字を小文字に、またはその逆に変換するプログラムを作成しますか?
与えられた解決策では、プログラムが という名前で呼び出されると、プログラムは にlower
変換lower
されupper
ます。ソリューション プログラムでは、Linux ではargv[0]
と比較されますが、そうではありません。"lower"
argv[0]
"./lower"
"lower"
誰かがそれを明確にしてもらえますか?
Shellはどのようにプログラムを実行しますか?(以下の非常に簡単な説明)
shell()
{
loader("Path name/Filename of your program", argv[0], argv[1]...for your program);
}
つまり、ローダーへのこれらすべての引数はシェルによって作成され、次にローダーが呼び出され、デフォルトでargv[0]はプログラムのパス名/ファイル名と同じになります。
./a.out ..と言うと、プログラムの絶対パス名は./a.outです(現在のディレクトリのファイルa.out)
./を省略できますか?環境変数PATHにが含まれている場合、答えは「はい」です。そのコンポーネントの1つとして、最初のコンポーネントを言います。
シェルプロンプトでecho$PATHと入力すると、PATH変数の内容が表示される場合があります(A:パスの個別のリストが表示されます)。
もしも 。シェルプロンプトにexportPATH=。:$ PATHと入力して、追加できます。
この後、a.outと入力して現在のディレクトリからコードを実行でき、。/a.outと入力する必要はありません。
なぜargv[0]が実行中のファイルの名前になるのか、これは明らかだと思います。
ここで、ファイル名ではなく、argv [0]に別の名前を付けることができますか?
答えは「はい」です。次に、ローダーを自分で呼び出す必要があります。つまり、シェルのように動作する小さなコードを記述します。
インターネット/マニュアルページでexecveファミリーの関数を参照できます。これは、実際にはここで参照されているローダーです。
次のテスト コードを検討してください。
#include <stdio.h>
int main(int argc, char** argv) {
printf("ARGV[0] = %s\n", argv[0]);
}
「test_argv」としてコンパイルして実行すると、プログラムを実行するために入力したものが得られます。
% ./test_argv
ARGV[0] = ./test_argv
% test_argv
ARGV[0] = test_argv
% /tmp/test_argv
ARGV[0] = /tmp/test_argv
したがって、たとえば、正規表現に対して、または部分文字列に対して文字列をテストする必要があります。