exec先調用啟動例程,啟動例程從核心取得指令行參數
退出函數
exit
_exit 或者_Exit
echo $? 擷取函數(比如main函數)的傳回值
exit會調用一些函數,稱為終止處理程式,而atexit用來登記這些函數
核心使程式執行的唯一方法是調用一個exec函數
環境表
如下,為一堆鍵值對
空間分布,棧一般都在高處(Linux從0xC0000000開始),正文一般是CPU機器指令(linux從0x08048000開始),每次函數調用都會生成棧幀,我的了解是,一個函數調用對應一個棧幀
相關的linux指令如下:,其中text代表正文段,即CPU執行的機器指令
使用共享庫的text,data,bss均大大減小,因為可執行檔案不再需要包含公共的庫函數(使用者态函數,比如malloc)
data代表已經初始化的資料,比如函數體外的:
int maxlen = 100;
,bss代表未初始化的資料,比如函數體外的:
long a[1000];
[email protected]:/home/learnApue/apue.3e/environ# ./echoarg arg1 Test foo
argv[0]: ./echoarg
argv[1]: arg1
argv[2]: Test
argv[3]: foo
[email protected]:/home/learnApue/apue.3e# size /usr/bin/cc /bin/sh
text data bss dec hex filename
1131683 15176 15048 1161907 11bab3 /usr/bin/cc
114971 4856 11312 131139 20043 /bin/sh
[email protected]:/home/learnApue/apue.3e/environ# gcc -static doatexit.c //不使用共享庫
[email protected]:/home/learnApue/apue.3e/environ# ls -l a.out
-rwxr-x--- 1 root root 876704 Sep 5 04:45 a.out
[email protected]:/home/learnApue/apue.3e/environ# size a.out //使用共享庫
text data bss dec hex filename
764793 20996 6016 791805 c14fd a.out
[email protected]:/home/learnApue/apue.3e/environ# gcc doatexit.c
[email protected]:/home/learnApue/apue.3e/environ# ls -l a.out
-rwxr-x--- 1 root root 17568 Sep 5 04:45 a.out
[email protected]:/home/learnApue/apue.3e/environ# size a.out
text data bss dec hex filename
4908 688 48 5644 160c a.out
環境變量
getenv(name) 擷取指定name的環境變量值
putenv/setenv 設定環境變量
unsetenv(name) 删除指定name環境變量的定義
看到unsetenv