int main( int argc, char *argv[] );
指針數(shù)組
正常終止
:
- 從main返回
- 調用exit
- 調用_exit或_Exit
- 最后一個線程從其啟動例程返回
- 從最后一個線程調用pthread_exit
異常終止
有3種方式:
- 調用abort
- 接到一個信號
- 最后一個線程對取消請求做出響應
#include <stdlib.h>
void exit(int status);
void _Exit(int status);
#include <unistd.h>
void _exit(int status);
終止狀態(tài)
或退出狀態(tài)
。大多數(shù)Unix系統(tǒng)shell都提供檢測進程終止狀態(tài)的方法。
- 調用這些函數(shù)時不帶終止狀態(tài)
- main執(zhí)行了一個無返回值的return語句
- main沒有聲明返回類型為整型
#include <stdlib.h>
int atexit(void (*func)(void)); // 參數(shù)是一個函數(shù)指針
Returns: 0 if OK, nonzero on error
終止處理程序
。注意:內(nèi)核使程序執(zhí)行的唯一方法是調用一個exec函數(shù)。進程自愿終止的唯一方法是顯式或隱式(通過調用exit)地調用_exit或_Exit。進程也可非自愿地由一個信號使其終止。
一個C程序的啟動,以及它的各種終止方式
extern char **environ;
稱environ為環(huán)境指針
;指針數(shù)組為環(huán)境表
,其中各指針指向的字符串為環(huán)境字符串
。歷史沿襲至今,C程序一直由以下幾部分組成:
- 正文段。這是由CPU執(zhí)行的機器指令部分。通常,正文段是可由多個應用程序共享的,在存儲器中只需一個副本。正文段常常是只讀的。
- 初始化數(shù)據(jù)段,也稱為數(shù)據(jù)段。包含了程序中需明確地賦初值的變量。
- 未初始化數(shù)據(jù)段,也稱為bss段(block started by symbol,由符號開始的塊)。在程序開始執(zhí)行之前,內(nèi)核將此段中的數(shù)據(jù)初始化為0或空指針。
- 棧。自動變量以及每次函數(shù)調用時所需保存的信息都存放在此段中。
- 堆。通常在堆中進行動態(tài)存儲分配。慣例,堆位于未初始化數(shù)據(jù)段和棧之間。
一種典型安排方式,這是程序的邏輯布局
size命令報告正文段、數(shù)據(jù)段和bss段的長度(以字節(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列分別是以十進制和十六進制表示的3段總長度
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)點:當函數(shù)返回時,自動釋放它所使用的棧幀,不再需要自己釋放空間缺點:alloca函數(shù)增加了棧幀的長度,而某些系統(tǒng)在函數(shù)已經(jīng)被調用后不能增加棧幀長度,于是也就不能支持alloca函數(shù)。本書4個平臺均支持該函數(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); // 當name已存在時,根據(jù)rewrite參數(shù)而覆蓋或保持原值
int unsetenv(const char *name); // 即使name不存在也不算出錯
新聞熱點
疑難解答