1. 命令列引數與環境變數
1) 現在 main 函式的形式一般是這樣的
int main(int argc, char *argv)
main函式的引數就叫做命令列引數,這是使用者在執行可執行檔案時傳入的引數。例如使用者執行了命令 grep -i hello
那麼grep的main函式就會收到引數 argc:3, argv[0] : grep, argv[1] : -i, argv[2] : hello。
總之,argc 表示引數的總數(包括命令本身), argv是引數列表,值得注意的是argv[0] 是命令本身。
2)環境變數
程序是有環境變數的,比如工作目錄,根目錄,home目錄等,我們可以通過乙個全域性的定義 extern char **environ 來訪問所有的環境變數,environ中的每一項都是key=value形式的, 比如 environ[1] == "home=/home/gengj",下面的**可以訪問到所有的預設環境變數。
#include
extern char **environ;
int main(int argc, char *argv)
return 0;
}
除了直接使用environ來訪問所有的環境變數,我們也可以使用getenv(char *name) 來獲得name指定的環境變數的值,同時我們也可以使用setenv(const char *name, const char *value, int rewrite) 來設定自己的環境變數。
2. 程序的位址空間
linux中的程序空間是分段的,乙個程序的位址空間有以下幾個段組成。其中**段的起始位址為 0x80480000,棧底的位址為0xc0000000。
3. 堆得分配與釋放
malloc(size_t size), 在堆上分配大小為size的空間,該空間並沒有被初始化,需要使用者自己初始化
calloc(size_t nobj, size_t size),在堆上分配size個大小為nobj的空間,也就是總空間為size*nobj,他會將分配的空間初始化為0
realloc(void *ptr, size_t newsize),如果ptr指向的空間後面有足夠的空間,他會直接在後面分配額外的空間,否則他會重新分配乙個大小為newsize的空間,然後將ptr指向的內容複製過來,所以返回的指標與ptr並不一定相等。
free(void *ptr), 釋放ptr指向的記憶體空間。
以上三個函式都是使用系統呼叫sbrk來實現的,sbrk的作用就是擴充套件堆空間。既然這是乙個系統呼叫,我們可以知道malloc的記憶體都是從核心申請過來的,不過當這塊記憶體被free的時候,這塊記憶體並不會返還給核心,而是存放在malloc pool中,以便下次malloc的時候直接從pool裡面分配。
實際上,malloc的時候,系統實際分配的記憶體要比申請的size要大一點點,這一點點記憶體中存放著這塊記憶體的大小以及指向下乙個分配過的記憶體的指標(聽起來很像鍊錶呀,沒錯,系統對堆得管理就是用鍊錶結構來實現的),這一點點記憶體非常重要,如果你破壞了他你的程式就會有意想不到的執行結果或者直接崩潰, 這就要求我們在程式設計的時候一定不要越界操作,慎重慎重!!!
4. 棧上的技巧setjmp() 與 longjmp()
首先宣告的是,這兩個函式是對程式棧的操作,他不會影響在其它段上的資料。
在你想要調到的地方呼叫 setjmp(), 這個系統呼叫就會把改點的執行資訊儲存下來,以便下次你跳回來的時候繼續執行;在你想要jump的地方呼叫longjmp() 這時候你就會跳回到呼叫setjmp的地方重新執行啦。看下面的**,longjmp的第二個引數就是setjmp的返回值,jmp_buf 中儲存了執行的一些資訊,跳轉時,在setjmp與longjmp之間的棧空間被釋放,中間的一切資料都要從新再生成一遍。
#include #include jmp_buf buffer;
void jmp_func()
int main()
《unix高階環境程式設計》程序環境 程序終止
當核心執行c程式時 使用乙個exec函式執行 在呼叫mian函式前先呼叫乙個特殊的啟動例程。可執行程式檔案將此啟動例程指定為程式的起始位址。下面是c程式啟動和終止的流程,由圖中可以知道,程序的終止根據不同的函式呼叫是不一樣的,其中 exit和 exit函式是終止程序直接進入核心,exit函式則先執行...
unix環境高階程式設計 守護程序
守護程序 daemon 是生存期長的一種程序,常常在系統引導裝入時啟動,僅在系統關閉時終止,因為它們沒有控制終端,unix有很多守護程序,它們執行日常事務活動。守護程序的特徵 執行指令 ps zxj a顯示其他使用者擁有的程序狀態,x顯示沒有終端控制的程序狀態,j顯示與作業有關的資訊 會話id 程序...
UNIX環境高階程式設計 守護程序
守護程序也稱精靈程序,是生存期較長的一種程序。它們通常在系統自舉時啟動,僅在系統關閉時才終止。因為它們沒有控制終端,所以它們都是在後台執行的。各標題意義 父程序id,程序id,程序組id,會話id,終端名稱,終端程序組id,使用者id 系統程序依賴於作業系統實現。父程序id為0的各程序通常是核心程序...