main函式的入口函式

2021-09-13 12:38:03 字數 2044 閱讀 8018

作業系統裝載程式之後,首先執行的**並不是main的第一行,而是某些別的**,這些**負責準備好main函式執行所需要的環境,並且負責呼叫main函式, 執行這些**的函式稱為入口函式或入口點(entry point),視平台的不同而有不同的名字。程式的入口點實際上是乙個程式的初始化和結束部分,它往往是執行庫的一部分。

a. 作業系統在建立程序後,把控制權交到了程式的入口,這個入口往往是執行庫中的某個入口函式。

b. 入口函式對執行庫和程式執行環境進行初始化,包括堆、i/o、執行緒、全域性變數構造,等等。

c. 入口函式在完成初始化之後,呼叫main函式,正式開始執行程式主體部分。

d. main函式執行完畢以後,返回到入口函式,入口函式進行清理工作,包括全域性變數析構、堆銷毀、關閉i/o等,然後進行系統呼叫結束程序。

msvc的crt預設的入口函式名為maincrtstartup

vc裡面預定義的一些全域性變數,其中_osver和_winver表示作業系統的版本,_winmajor是主版本號等。通過呼叫getversionexa(這是乙個windows api)來獲得當前的作業系統版本資訊

一開始進行記憶體分配的不是malloc而是_alloca,此時還沒有初始化堆,因為在程式的一開始堆還沒有被初始化,而alloca是唯一可以不使用堆的動態分配機制。alloca可以在棧上分配任意大小的空間(只要棧的大小允許),並且在函式返回的時候會自動釋放,就好像區域性變數一樣。

由於沒有初始化堆,所以很多事情沒法做,第一步把堆先初始化了:

if ( !_heap_init(0) )

- 這裡使用_heap_init函式對堆(heap)進行了初始化,如果堆初始化失敗,那

麼程式就直接退出了。

- 它僅僅呼叫了heapcreate的api建立了乙個系統堆,那麼msvc的malloc其實

也是呼叫這個api將堆管理過程交給系統

使用_ioinit函式初始化了i/o,接下來這段**呼叫了一系列函式進行各種初始化,包括:

_setar**:初始化main函式的ar**引數。

_setenv:設定環境變數。

_cinit:其他的c庫設定。

file結構體

struct _iobuf 

;typedef struct _iobuf file;

- 這個file結構中最重要的乙個欄位是_file,_file是乙個整數,通過_file可以訪問到內部檔案控制代碼表中的某一項。在windows中,使用者態使用控制代碼(handle)來訪問核心檔案物件,控制代碼本身是乙個32位的資料型別,在有些場合使用int來儲存,有些場合使用指標來表示。

在msvc的crt中,已經開啟的檔案控制代碼的資訊使用資料結構ioinfo來表示:

typedef struct 

ioinfo;

□ 在這個結構中,osfhnd欄位即為開啟檔案的控制代碼,這裡使用8位元組整數型別intptr_t來儲存。另外osfile的意義為檔案的開啟屬性。而pipech欄位則為用於管道的單字元緩衝,這裡可以先忽略。

□ 在crt/src/ioinit/c中有乙個陣列-------ioinfo *_pioinfo[64]; //等效於 ioinfo _pioinfo[64][32]

□ 二維上可容納32個ioinfo結構,因此該錶可容納64 * 32 = 2048 個控制代碼

□ 而file中_file的值就是和上面的osfhnd直接關聯

® _file中第五位到第十位是一維座標

® _file中第零位到第四位是二維座標

□ 應用程式可以通過api getstartupinfo來繼承開啟的檔案

e. 總體步驟

1. 初始化和os版本有關的全域性變數。

2. 初始化堆。

3. 初始化i/o。

4. 獲取命令列引數和環境變數。

5. 初始化c庫的一些資料。

6. 呼叫main並記錄返回值。

7. 檢查錯誤並將main的返回值返回。

main函式入口

最近在弄boost test單元測試的時候,遇到了乙個執行程式後就閃退掉的問題,找了好久才發現,原來是沒有進入到boost 自己的main函式中,因為鏈結的其他lib中,有乙個檔案也定義了main函式,編輯器最終是選擇了那個main函式作為程式的入口。在vs下 main函式 通常是 int tmai...

main 函式的入口引數

c c 語言中的main函式,經常帶有引數argc,argv,如下 int main int argc,char argv int main int argc,char argv 這兩個引數的作用是什麼呢?argc 是指命令列輸入引數的個數,argv儲存了所有的命令列引數。假如你的程式是hello....

Python 程式入口main函式

在乙個.py檔案中,如果不是在定義函式,也就是說不是在def關鍵字的內嵌結構內,python會預設其餘部分函式是main函式,並自動執行,但正規工程中,一般都會將main函式寫為 if name main 每個人都在寫,但很少有人問,其實這個用法很巧妙!hello.py defsayhello st...