linux程式的命令列引數

2021-09-21 04:03:41 字數 908 閱讀 6351

程式執行的時候需要命令列引數,linux中更是這樣,隨便在shell輸入/bin/xx --help後列舉出來的引數讓你頭暈眼花,可是這些引數是怎麼進入程式的呢,我們知道程式執行的時候一般從main開始,而mian有兩個引數,乙個是 argc代表引數的個數,乙個是ar**代表具體字串型別的引數,這是我們所看到的,我們都知道函式的引數都在堆疊中,在呼叫函式前,主調函式應該將引數壓入堆疊後再呼叫被調函式,那麼是誰呼叫的main函式呢?又是誰將main的引數壓入堆疊的呢? 

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

int execve(const char *filename, char *const ar**,char *const envp);

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

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

asmlinkage int sys_execve(struct pt_regs regs)

{

linux程式的命令列引數

程式執行的時候需要命令列引數,linux中更是這樣,隨便在shell輸入 bin xx help後列舉出來的引數讓你頭暈眼花,可是這些引數是怎麼進入程式的呢,我們知道程式執行的時候一般從main開始,而mian有兩個引數,乙個是 argc代表引數的個數,乙個是argv代表具體字串型別的引數,這是我們...

linux程式的命令列引數

程式執行的時候需要命令列引數,linux中更是這樣,隨便在shell輸入 bin xx help後列舉出來的引數讓你頭暈眼花,可是這些引數是怎麼進入程式的呢,我們知道程式執行的時候一般從main開始,而mian有兩個引數,乙個是 argc代表引數的個數,乙個是argv代表具體字串型別的引數,這是我們...

C C 程式的命令列引數

c 程式的main函式有兩個引數 int main int argc,char argv 我以前 大學學習的時候 一直沒有弄清楚這兩個引數的真正目的,一直到做linux c開發的時候,才知道,原來這兩個引數就是用來提供我們在linux的終端上執行某個命令時,攜帶的額外引數,例如 gcc o test...