1. 程式人生 > >【轉載】linux作業系統與應用程式的main函式

【轉載】linux作業系統與應用程式的main函式

來源:https://blog.csdn.net/h542723151/article/details/52154871

 

這幾天一直在糾結:

main函式是程式的入口,一個程式啟動後,經過bootloader的初始化就該經main函式進入C語言的世界,但是linux中每個應用程式的開始都是從main函式開始的。linux下有多個應用程式,豈不是有很多個main。那bootloader會知道跳到哪個main?多個main編譯怎麼不衝突?

 

在網上搜索了很久,漸漸的有些明白了:

1、main函式是C語言的入口,這句話沒錯;但是這句話僅僅是一個約定,而非一個亙古不變的鐵律!從程式的更為本質的彙編程式碼來看,只是大家約定彙編初始化完了後,跳到一個名字叫"main"的標號處;言外之意就是這個標號也是可以改名的,比如linux的C語言入口就是start_kernel();從這個標號地址後就是C語言的天下了。用main這個名字僅僅是因為大家的約定而已,不遵守約定能玩的轉也行啊,就像蘋果充電線啥的都和別人不一樣。

2、在編譯時是不存多個main函式的!每個應用程式雖說都有一個main函式(從應用程式來看應用程式的入口是main函式哦);但是應用程式都是獨立編譯的,不會一起編譯,作業系統核心就更不可能和應用程式一起編譯了!所以根本不存在多個main衝突的!!可能是統一作業系統與應用程式之間的介面,抑或是側面影響下main是程式入口的說法,main是應用程式和作業系統之間約定好的一個介面名!所以linux中每個應用程式的第一個函式必須是main。除非你改掉了核心排程的介面地方。

3、linux的應用程式的安裝啟動也可以類比下我們每天都在用的Windows。Windows應用程式的安裝其實也是把一些執行檔案拷貝到指定的資料夾裡(從綠色軟體看),點選就可以執行。linux下也是這樣。編譯好的bin檔案放到指定的資料夾目錄下,然後用命令啟動執行。

RS:剛剛學習linux,不清楚轉載內容是否正確,但感覺有些道理,暫認為正確;