コマンドライン引数の保存に疑問があります。
myprog.exe -cfgfile myconfig.cfg
コマンドライン引数はプロセスが作成されたときに渡されるので、プロセスの外に保存されますか?
OSはどこに保存しますか?
コマンドライン引数の保存に疑問があります。
myprog.exe -cfgfile myconfig.cfg
コマンドライン引数はプロセスが作成されたときに渡されるので、プロセスの外に保存されますか?
OSはどこに保存しますか?
Windows の場合、コマンド ライン引数はPEB
、プロセスの作成時にユーザー プロセスのアドレス空間に割り当てられるプロセス環境ブロック ( ) に保持されます。
詳細については、Windows Internals を参照してください。Chapter 5 - Processes, Threads, and Jobs からの抜粋です。
Unixフレーバーでも同じだと思います。このデータは、プロセス自体がアクセスできるように、プロセス メモリに存在する必要があります。
それはOSとおそらく言語に依存します。C 中心の適切な答えは、OS がプロセス空間を作成することです (コードのロード、ヒープとスタックの作成などを含む)。次に、コマンド ライン引数ベクトルをある場所に配置し、引数ベクトルのアドレスをスタックの 'argv' にコピーし、単語数を 'argc' にコピーします。
これらのタスクが完了した後でのみ、OS はプロセスの実行を許可します。
Linux の場合: コマンド ライン引数はスタックに格納されます。環境変数とコマンド ライン引数を混同しないでください。プロセス アドレス空間には、環境変数用に別のメモリ領域があります。
コマンド ライン引数は、アプリケーションのメモリ空間に格納されます。OS ごとに正確にどこが異なるかというと、通常はヒープの一番下にあると思います。それを配置するコードは、Unix ライクな OS の exec のカーネル ソース コードにありますが、Windows のどこにあるのかわかりません (とにかくソースを見ることができるわけではありません)。C ランタイム コード (「crt」の由来) は、スタックから argv と argc を取得し、main を呼び出します。Linux で実行可能ファイルがどのように起動するかについて詳しく知りたい場合は、Ulrich Drepper (glibc メンテナー) によるこのペーパーが役立つかもしれません: http://people.redhat.com/drepper/dsohowto.pdf