天天看點

linux程式的指令行參數

程式執行的時候需要指令行參數,linux中更是這樣,随便在shell輸入/bin/XX --help後列舉出來的參數讓你頭暈眼花,可是這些參數是怎麼進入程式的呢,我們知道程式執行的時候一般從main開始,而mian有兩個參數,一個是 argc代表參數的個數,一個是argv代表具體字元串類型的參數,這是我們所看到的,我們都知道函數的參數都在堆棧中,在調用函數前,主調函數應該将參數壓入堆棧後再調用被調函數,那麼是誰調用的main函數呢?又是誰将main的參數壓入堆棧的呢? 

關于第一個問題,是誰調用的main函數,我就不多說了,因為網上已經有了一篇叫做《before main》的文章了,寫得非常好,可以搜尋一下,讀了此文你會明白實際上使用者程序的開始函數并不是main,在main之前還有很多工作要做,但是如果說 是XX調用了main,那麼就是XX壓入了參數,我們很多人喜歡糾着一個問題一直到底,那我們就較較真兒,又是誰将參數給了XX呢?我們開始一個程式的時 候要調用exec系列函數,比如execve,我們看看execve的聲明:

int execve(const char *filename, char *const argv[],char *const envp[]);

我 們看一下這第二個和第三個參數實際上就是main的參數(main的第一個參數argc是由這些參數算出來的),而調用execve的時候還是原來的進 程,新的程序還隻是一個filename,具體能否執行還有待商榷呢,新程序根本沒有映射進使用者空間,這時這些參數是怎麼傳遞給新的程序的呢?我們于是就來正式解答第二個問題:又是誰将main的參數壓入堆棧的呢?

研究linux有個好的不得了的資源就是核心,當你遇到任何棘手的問題都可以從核心得到解答,當然今天我們的問題并不算棘手!我們還是看看sys_ececve是怎麼做的:

asmlinkage int sys_execve(struct pt_regs regs)

{

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1273434

繼續閱讀