が実行可能ファイル名を表していることは知っていますが、それがどのように実装されているか、つまりソース コード レベルargv[0]
でファイル名とオプションを取得する方法がわかりません。最初はLinuxの組み込み関数に依存していると思っていましたが、Windowsでもサポートされていることがわかり、コンパイラーによって行われる可能性があると思いましたか?
3 に答える
これは実際にはC99標準の一部であるため、コンパイラとオペレーティングシステム間で同じ実装が行われます。5.1.2.2.1プログラムの起動(12ページ)から:
の値が
argc
ゼロより大きい場合、が指す文字列はプログラム名argv[0]
を表します。プログラム名がホスト環境から利用できない場合は、ヌル文字になります。の値が1より大きい場合、throughが指す文字列はプログラムパラメータを表します。argv[0][0]
argc
argv[1]
argv[argc-1]
編集:Waleed Khanのコメントをフォローアップすると、次の方法でこれらの値を取得できます。
- Linux-
/proc/self/cmdline
- OSX-
_NSGetArgc
/_NSGetArgv
または[NSProcessInfo arguments]
- Windows-
GetCommandLine()
とCommandLineToArgvW()
バイナリが実行されると、glibc は関数 __libc_start_main を呼び出します。これはボールをシステム コール execve に渡し、そこで argv/argc がスタックにプッシュされます。
カーネルはスタックを解析して argv を設定します。したがって、解析部分を変更または理解することに興味がある場合は、カーネルの execve コードを調べる必要があります。lxr でそれをたどると、この行に到達します。私はあなたが探しているものだと信じています: http://lxr.linux.no/linux+v3.0/fs/exec.c#L1541
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=fs/exec.c#l1376 sys_execve()を検索し、カーネルコードを読みます、あなたはそれを見つけることができます。