所有的程式都從main開始執行,這是使用者能看到的執行入口,但其實作業系統建立程序後,把控制權交到了程式入口,這個入口往往是程式執行庫中的某個入口函式,這個入口函式做了大量的工作:
1、 設定棧指標;
2、 全域性物件的初始化(c/c++的全域性變數以及c++全域性物件的建構函式等);
3、 初始化一些變數;
4、 將main函式的引數壓棧,並執行main
那在main函式執行完後又做了哪些工作呢:
1、main函式執行完畢後返回到上述的入口函式,入口函式進行清理工作;
2、全域性變數析構、堆銷毀(空間釋放)、關閉
i/o等;
3、系統呼叫結束程序。
如果想在
main
函式執行前做一些初始化等操作,可以給需要執行的函式設定以下屬性:
__attribute__((constructor(prio)))func a
__attribute__((constructor(prio)))func b
執行順序是先執行
a,再執行
b;如果想在
main
函式執行完後做一些操作,可以使用以下屬性:
__attribute_((deconstructor(prio)))func a
__attribute_((deconstructor(prio)))func b
上述執行順序是
b先執行,然後再執行
a;(prio)
是可以省略的,省略後執行順序按照預設,如果設定了優先順序,則按優先順序順序執行。
如果需要在**中新增
main
執行完後執行的函式,可使用
atexit(funcptr)
註冊,先註冊的後執行,類似壓棧。
main函式執行前發生了什麼
main函式的身前 1.編譯器預設是找 start 符號,而不是 main 2.start 這個符號是程式的起始點 3.main 是被標準庫呼叫的乙個符號 我們寫程式,比如乙個模組,通常要有 initialize 和de initialize 但是我們寫 c 程式的時候為什麼有些模組沒有這兩個過程麼...
C 在main 函式執行前,後執行了哪些操作
設定棧指標 初始化static靜態和global全域性變數,即data段的內容 將未初始化部分的全域性變數賦初值 數值型short,int,long等為0,bool為false,指標為null,等等,即.bss段的內容 全域性物件初始化,在main之前呼叫建構函式 將main函式的引數,argc,a...
後台執行 前台執行
例項參考 這個用在命令的最後,可以把這個命令放到後台執行 將乙個正在前台執行的任務放到後台,並且暫停,用術語講就是掛起 將乙個正在前台執行的任務終止執行,也就是常說的結束任務,術語 終止 檢視當前有多少在後台執行的命令 將後台中的任務 命令調至前台繼續執行 如果後台中有多個命令,可以用 fg job...