main執行前與執行後

2021-08-20 12:00:32 字數 879 閱讀 5364

所有的程式都從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...