33

コマンドラインから main() に引数を渡すことについて私が理解していることは、argc の最小値は 1 であり、argv[0] には常にそのパスを含むプログラム名が含まれることです。

コマンド ラインで引数が指定されている場合、argc は 1 より大きい値を持ち、argv 1から argv[argc-1] はそれらの引数を持ちます。

今、このリンクの段落はそれを言っています

argv[0] は、プログラムの名前を含む文字列か、それが利用できない場合はnull 文字列になります。

では、argv[0] はいつ、どのようにして null 文字列を持つことができるのでしょうか? パスを含むプログラム名は常に利用できるので、いつnullになることができますか?

ライターは「それが利用できない場合」と言っていますが、いつ、どのようにしてプログラム名が利用できない可能性がありますか?

4

4 に答える 4

33

呼び出しのexecクラスでは、プログラムとプログラム実行可能ファイルを別々に指定して、NULLに設定できるようにします。

しかし、その引用は実際にはISO標準(言い換えられる可能性があります)からのものであり、その標準は、最小のマイクロコントローラーから最新のz10Enterpriseクラスのメインフレームまでの非常に広範囲の実行環境をカバーしています。

これらの組み込みシステムの多くは、実行可能ファイルの名前がほとんど意味をなさない状況にあります。

最新のc1xドラフトから:

の値はargc非負でなければなりません。

argv[argc]はnullポインタでなければなりません。

の値がargcゼロより大きい場合、配列メンバーargv[0]argv[argc-1]は文字列へのポインタが含まれている必要があります。文字列には、プログラムの起動前にホスト環境によって実装定義の値が与えられます。

これは、argcがゼロの場合(そしてそれが可能である場合)、argv[0]がNULLであることを意味します。

ただし、が0でない場合でもargc標準には次のように記載されているため、プログラム名を取得できない場合があります。

の値がargcゼロより大きい場合、が指す文字列argv[0]はプログラム名を表します。argv[0][0]プログラム名がホスト環境から利用できない場合は、ヌル文字になります。の値がargc1より大きい場合、argv[1]throughが指す文字列argv[argc-1]はプログラムパラメータを表します。

したがって、標準ではプログラム名を指定する必要はありません。私は、プログラムがこの値に対して幅広いオプションを使用しているのを見てきました。

  • まったく値がありません(想定されるセキュリティのため)。
  • 露骨な嘘(sleep悪意のあるコードなど)。
  • 実際のプログラム名(などsleep)。
  • わずかに変更されたもの(-kshログインシェルなど)。
  • わかりやすい名前(例:)progname - a program for something
于 2010-05-08T13:08:36.757 に答える
7

このメーリングリストによると、。のargv[0]場合はnullになる可能性がありますargc == 0。しかし、彼らはいつゼロになるかについては説明していません。 実行可能ファイルが「通常」に起動されなかった場合(つまり、コマンドラインなどを介して)はゼロになるとargc思います。実際、@ paxdiabloが述べたように、関数ファミリーを使用して手動 設定できます。それらの引数に応じてゼロになります。argcpopenargvexecargc

しかし、彼らの理論的根拠のセクションでは:

初期の提案では、argc渡された値main()が「1以上」である必要がありました。これは、ISOC標準のドラフトと同じ要件によって推進されました。実際、exec関数の呼び出し元に引数が指定されていない場合、履歴実装はゼロの値を渡しました。この要件はISOC標準から削除され、その後IEEEStd1003.1-2001のこのボリュームからも削除されました。表現、特に単語の使用は、厳密に準拠したPOSIXアプリケーションがexec関数に少なくとも1つの引数を渡す必要があるため、そのargcようなアプリケーションによって呼び出されたときに1つ以上であることを保証します。実際、多くの既存のアプリケーションargv[0]は最初にの値をチェックせずに参照するため、これは良い習慣ですargc

argcつまり、厳密に準拠したPOSIXアプリケーションはゼロより大きくなければなりませんが、それ以外の場合は保証されません。

プログラムの起動セクションに関する標準についてはargc、もう少し情報があります。argv

于 2010-05-08T13:05:35.117 に答える
3

プログラムに名前がないプラットフォームを想像することは可能です-おそらくコードは起動時にロードされるだけです。それらについては、argv[0]はNULLであると推測できます。C標準は確かにゼロのargc値を許可し、argv[argc]はNULLでなければならないと言っています。

于 2010-05-08T13:10:17.397 に答える