int main( int argc, char *argv[] );
指針數(shù)組
正常終止
:
- 從main返回
- 調(diào)用exit
- 調(diào)用_exit或_Exit
- 最后一個(gè)線程從其啟動(dòng)例程返回
- 從最后一個(gè)線程調(diào)用pthread_exit
異常終止
有3種方式:
- 調(diào)用abort
- 接到一個(gè)信號(hào)
- 最后一個(gè)線程對(duì)取消請(qǐng)求做出響應(yīng)
#include <stdlib.h>
void exit(int status);
void _Exit(int status);
#include <unistd.h>
void _exit(int status);
終止?fàn)顟B(tài)
或退出狀態(tài)
。大多數(shù)Unix系統(tǒng)shell都提供檢測(cè)進(jìn)程終止?fàn)顟B(tài)的方法。
- 調(diào)用這些函數(shù)時(shí)不帶終止?fàn)顟B(tài)
- main執(zhí)行了一個(gè)無返回值的return語句
- main沒有聲明返回類型為整型
#include <stdlib.h>
int atexit(void (*func)(void)); // 參數(shù)是一個(gè)函數(shù)指針
Returns: 0 if OK, nonzero on error
終止處理程序
。注意:內(nèi)核使程序執(zhí)行的唯一方法是調(diào)用一個(gè)exec函數(shù)。進(jìn)程自愿終止的唯一方法是顯式或隱式(通過調(diào)用exit)地調(diào)用_exit或_Exit。進(jìn)程也可非自愿地由一個(gè)信號(hào)使其終止。
一個(gè)C程序的啟動(dòng),以及它的各種終止方式
extern char **environ;
稱environ為環(huán)境指針
;指針數(shù)組為環(huán)境表
,其中各指針指向的字符串為環(huán)境字符串
。歷史沿襲至今,C程序一直由以下幾部分組成:
- 正文段。這是由CPU執(zhí)行的機(jī)器指令部分。通常,正文段是可由多個(gè)應(yīng)用程序共享的,在存儲(chǔ)器中只需一個(gè)副本。正文段常常是只讀的。
- 初始化數(shù)據(jù)段,也稱為數(shù)據(jù)段。包含了程序中需明確地賦初值的變量。
- 未初始化數(shù)據(jù)段,也稱為bss段(block started by symbol,由符號(hào)開始的塊)。在程序開始執(zhí)行之前,內(nèi)核將此段中的數(shù)據(jù)初始化為0或空指針。
- 棧。自動(dòng)變量以及每次函數(shù)調(diào)用時(shí)所需保存的信息都存放在此段中。
- 堆。通常在堆中進(jìn)行動(dòng)態(tài)存儲(chǔ)分配。慣例,堆位于未初始化數(shù)據(jù)段和棧之間。
一種典型安排方式,這是程序的邏輯布局
size命令報(bào)告正文段、數(shù)據(jù)段和bss段的長(zhǎng)度(以字節(jié)為單位)
$ size /usr/bin/cc /bin/shtext data bss dec hex filename346919 3576 6680 357175 57337 /usr/bin/cc102134 1776 11272 115182 1c1ee /bin/sh第4、5列分別是以十進(jìn)制和十六進(jìn)制表示的3段總長(zhǎng)度
malloc,初始值不確定calloc,每一位都初始化為0realloc,新增區(qū)域內(nèi)的初始值不確定
#include <stdlib.h>
void *malloc(size_t size);
void *calloc(size_t nobj, size_t size);
void *realloc(void *ptr, size_t newsize);
All three return: non-null pointer if OK, NULL on error
void free(void *ptr);
優(yōu)點(diǎn):當(dāng)函數(shù)返回時(shí),自動(dòng)釋放它所使用的棧幀,不再需要自己釋放空間缺點(diǎn):alloca函數(shù)增加了棧幀的長(zhǎng)度,而某些系統(tǒng)在函數(shù)已經(jīng)被調(diào)用后不能增加棧幀長(zhǎng)度,于是也就不能支持alloca函數(shù)。本書4個(gè)平臺(tái)均支持該函數(shù)。
#include <stdlib.h>
char *getenv(const char *name);
Returns: pointer to value associated with name, NULL if not found
#include <stdlib.h>
int putenv(char *str); // name已存在,替換
Returns: 0 if OK, nonzero on error
int setenv(const char *name, const char *value, int rewrite); // 當(dāng)name已存在時(shí),根據(jù)rewrite參數(shù)而覆蓋或保持原值
int unsetenv(const char *name); // 即使name不存在也不算出錯(cuò)
新聞熱點(diǎn)
疑難解答
圖片精選