C語言必須寫main函數?最簡單的 Hello world 你其實一點都不懂!
是的,你沒有看錯,從今天開始,公眾號會持續原創一系列C語言的內容,同時穿插作業系統,組成原理,彙編,以及一些類比,目的是讓大家能夠在抽象中尋到具象,也是我想分享的計算機學習方法。
之前的我寫作,一直都是追求往前創新,而不想回顧過去自己的知識,但是這段時間在B站講課,直播,發現大家問的很多問題,其實我都遇見過,也找到了解決的方法,所以有了這個引子,也就有了這個專題。
這個專題當時寫了11個小節,然後在不斷細化後,越來越多,形成了體系,於是準備慢慢來說,把這個計算機的建立過程拆解,擺在大家面前,再也不是龐然大物,而是有跡可循。
今天我們說下,命令行參數,我們在寫工具的時候,基本上都是帶著參數的。而在windows XP或更高版本,命令行的最大長度為8191個字符,Linux下可以用這個命令查看,getconf ARG_MAX,一般情況下都是比windows大很多。
之前遇見編譯開源項目,爆出的錯誤是參數太長,通過映射路徑,windows下還是長,在Linux下可以編過,最後因為Linux開發的話難度太大,所以對腳本進行了調整,把源碼拆分,變成obj後,再進行連結,合併,從而減少參數長度。
那我們先看下命令行參數代碼怎麼寫?我們上一節寫的main,是最普通的main,現在常用的就兩種。
int main(void){}
int main(int argc,char *argv[]){}
我們平時寫的時候,用的第一種,但我們寫工具的時候,會用第二種,這個可以傳參,我們看下例子:
輸出效果是:
main函數的兩個參數,argc代表了參數個數,默認是1,也就是程序名字,argv[] 代表傳遞的參數具體字串,我們使用的時候用這個判斷即可。
看到這裡大家發現參數很簡單,我們平時使用也會用這個,但是這個不是標準的命令參數解析的方法,我們今天看下官方源碼是怎麼處理的,我們可以下載busybox開原始碼學習命令,也可以在https://directory.fsf.org/wiki/GNU 下載
Coreutils 軟體包包括一整套基本的 shell 工具,可以去看各個shell命令的實現,我們今天用busybox裡面的實現,來說下就可以。我這裡看的是ls的解析,這裡我們發現有個getoptxxx,這個就是系統提供的解析參數的方法。
我們找下標準的函數,getopt_long,而這個代碼的實現,是在glibc,這個可以在https://mirrors.aliyun.com/gnu/ 下載,當然這裡面有很多工具,都是GNU項目下的源碼,可以下載,比如我們的bash就是在這裡下載的。
如果你感興趣,而且真正要學習編程,把這個代碼下載下來,去閱讀下我們調用的系統方法,它們都是怎麼實現的。
我們這裡直接看用法,我們看下百度的說明:
這裡要去練習,我們測試下,看看效果:
輸出的結果:
這裡看下b和c的參數,如果必須要參數,是 -b 3 ,使用空格的。如果是可有可無的話,這裡-c4 ,c和4是連著的。
而我們平時所說的終端,就是一個程序,這裡參考bash的源碼,終端等待輸入參數,然後判斷之後,進行創建子進程,把參數傳遞進去,等待返回結果,大致的shell運行如下:
參看 https://blog.csdn.net/ruglcc/article/details/8574113
核心終端的操作邏輯是:fork 創建子進程,然後使用execvp這一組的進程替換程序的機制,進行運行實際的命令,同時使用pipe管道通信,等待子進程的運行結果,然後把結果顯示出來。
好了這一講就分享到這裡,下一節我們來說下,c語言從源碼到最終可執行程序,每一步都做了什麼,以及如何理解每個環節。
~~ end not end ~~
熱門文章
零基礎新手自學Python編程教程入門精通學習資料網站大全
自學編程C語言不迷路,我私藏的書單分享給你!
零基礎新手學習算法Leetcode刷題指南
程式設計師碼農IT工程師自學編程計算機入門進階學習網站大全
程式設計師面試題寶典以及相關書籍下載!
計算機類常用電子書整理大全
職場老鳥,網際網路十年從業生涯,分享 [Java,Python,安卓,AI,爬蟲] 技術文章,學習資料, 熱點趣聞等。關注回復 1024 Python 電子書大全 面試資料,給你一份私藏的程式設計師好禮,永遠更新中!趕緊來關注哦!
我的微信 code_gg_boy 。