2015-11-17 10 views
7

Cでは、プログラムの引数を受け取るのに本当に必要なのはint main(int argc, char *argv[])ですか?言い換えれば、署名がint main(void)のmain関数を定義する場合、POSIXインタフェースのみを使用してプログラム引数を回復することは可能ですか?POSIXでは、メイン(無効)コマンドライン引数を回復できますか?

私は何かが欠けてるように私はそれを見て、感じる:

  • POSIXは、他のプロセス固有の情報を取得するために複数のインタフェースを定義します。例えば、環境変数(おそらくC99から継承されているが、unsetenv()のような機能で拡張されている)とホストID(gethostid())のためのインターフェースがある。
  • 特定のオペレーティングシステムでは、コマンドライン引数を取得するための「グローバル」な方法が定義されています。たとえば、WindowsはGetCommandLineWCommandLineToArgvW関数を提供し、HP-UXはグローバル変数__argc_value__argv_valueを提供します。 Linuxには/proc/self/cmdlineがあり、これはargvargcに解析できます。
+0

私はそれが実装定義されていると思います。 –

+0

関数 'int f(void)'を考えてみましょう。あなたは呼び出し元から関数に渡された引数にどのようにアクセスしますか? – Olaf

+1

Windowsでは、Windowsは[完全実装定義のメイン定義方法](https://msdn.microsoft.com/en-us/library/windows/desktop/ms633559%28v=vs.85%29)を使用しています。 aspx)。これは、別々の非標準API関数を介してコマンドライン引数を取得する必要性を説明することができます。 – Lundin

答えて

4

POSIX仕様には、コマンドライン引数を取得できる関数は含まれていません。指定されたすべての関数は、main()を使用して、argcargvを解析するように調整する必要があります。

POSIX仕様(IEEE 1003.1、2013版 - 私がこれを書いているように)には、標準ユーティリティ(「シェルとユーティリティ」のボリュームで説明されている)で使用されるコマンドライン構文を説明するセクションがあります。しかし、当然のことながら、これらのユーティリティはPOSIX関数を使用するため、それらを呼び出すmain(argc, argv)で実装されます。

関連する問題