main函数的入口函数
生活随笔
收集整理的這篇文章主要介紹了
main函数的入口函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
操作系統裝載程序之后,首先運行的代碼并不是main的第一行,而是某些別的代碼,這些代碼負責準備好main函數執行所需要的環境,并且負責調用main函數, 運行這些代碼的函數稱為入口函數或入口點(Entry Point),視平臺的不同而有不同的名字。程序的入口點實際上是一個程序的初始化和結束部分,它往往是運行庫的一部分。
一個典型的程序運行步驟
a. 操作系統在創建進程后,把控制權交到了程序的入口,這個入口往往是運行庫中的某個入口函數。
b. 入口函數對運行庫和程序運行環境進行初始化,包括堆、I/O、線程、全局變量構造,等等。
c. 入口函數在完成初始化之后,調用main函數,正式開始執行程序主體部分。
d. main函數執行完畢以后,返回到入口函數,入口函數進行清理工作,包括全局變量析構、堆銷毀、關閉I/O等,然后進行系統調用結束進程。
main函數入口點
MSVC的CRT默認的入口函數名為 mainCRTStartup
使用_ioinit函數初始化了I/O,接下來這段代碼調用了一系列函數進行各種初始化,包括:
FILE結構體
struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname; }; typedef struct _iobuf FILE; - 這個FILE結構中最重要的一個字段是_file,_file是一個整數,通過_file可以訪問到內部文件句柄表中的某一項。在Windows中,用戶態使用句柄(Handle)來訪問內核文件對象,句柄本身是一個32位的數據類型,在有些場合使用int來儲存,有些場合使用指針來表示。在MSVC的CRT中,已經打開的文件句柄的信息使用數據結構ioinfo來表示:
typedef struct {intptr_t osfhnd;char osfile;char pipech;} 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函数的入口函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 静态路由(原理+实验)
- 下一篇: 大数据之路Week08_day03 (H