簡體   English   中英

C ++如何將命令行參數轉換為數組?

[英]How C++ turns command line arguments into an array?

我想C ++如何將命令行參數轉換為char數組? 什么“秘密”代碼這樣做? 我在哪里可以查看執行此操作的代碼(即使它在匯編中,我知道一些匯編)? 我正在使用Linux,如果這有幫助的話。

謝謝

在大多數(所有?)基於Unix的操作系統中,它們已經是一個數組。 這就是操作系統在那里執行進程的方式 - 當進程啟動時,已經有一系列參數可供它使用。

將命令行轉換為數組的代碼存在於shell(如bash)或啟動另一個程序的任何其他程序中。 bash有它的可用來源,其他程序 - 它是不同的。

在Windows中,它們是一個字符串(您可以使用GetCommandLine() API調用來修改它),它由C運行時庫解析以將其轉換為數組,因為語言規范要求它們作為數組出現。

對於使用Visual C ++編譯的程序,執行此操作的代碼包含在Visual Studio分發中。 您可能必須在安裝程序中打開一個類似“包含C運行時庫源”的復選框才能安裝它。

這通常由操作系統在為程序創建進程時處理。 這段代碼很好地用C語言編寫(例如,如果操作系統是用C語言編寫的),或者它可以在匯編中。 要查找此代碼,您可能需要查看操作系統代碼。

希望這可以幫助!

管理命令行參數並在進程創建期間將其放入堆棧是一項操作系統工作。

對於POSIX系統,執行路徑是:

  1. 在您的程序中,您調用execle / execve / ...系統調用,將路徑傳遞給新的進程可執行文件和命令行參數。
  2. 這些數據轉到內核
  3. 內核更新其內部結構以考慮新的進程標識並為新進程分配地址空間(如果不再需要,內核也會清除舊的地址空間)。 內核用零初始化進程內存,將信息從舊內存復制到堆棧頂部的新地址空間。
  4. 內核將新進程放入調度隊列並從exec()系統調用返回,將執行路徑傳遞到用戶空間並最終傳遞到進程的入口點(這通常是來自crt0.o目標文件的例程,它是鏈接的默認情況下,每個可執行文件 - 此例程調用main() )。

對於Linux,您可以在此處看到此代碼: http//www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/fs/exec.c#L383

383 /*
384  * 'copy_strings()' copies argument/environment strings from the old
385  * processes's memory to the new process's stack.  The call to get_user_pages()
386  * ensures the destination page is created and not swapped out.
387  */

在用戶空間execve()系統調用的do_execve()內核對應部分,在第1345行,調用copy_strings()copy_strings()例程實際上完成了你所詢問的工作。

它是c運行時庫的一部分。 如果你想知道那是什么,請看這里: 什么是C運行時庫?

我剛剛使用Microsoft Visual Studio創建了一個基本的C ++控制台應用程序,並在程序的第一行設置了一個斷點。 調試時,程序在該行停止,並且您調用查找調用堆棧以查看調用“main”的函數。 調用函數是c運行時的一部分,這似乎包含一些操作命令行的代碼......我沒有仔細看過,但這可能就是你應該從哪里開始的。

有時它不是首先執行的實際main() 例如,在Visual Studio上,函數mainCRTStartup()充當入口點,調用Windows API來檢索和解析命令行(如果使用調試器,則可以看到這一點)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM