1. 程式人生 > >讀書筆記-APUE第三版-(7)進程環境

讀書筆記-APUE第三版-(7)進程環境

第三版 pue avi 指針 註意 初始化 執行 命令行 fcm

本章關註單進程執行環境:啟動&終止、參數傳遞和內存布局等。

進程啟動終止

技術分享

如圖所看到的:

  1. 啟動:內核通過exec函數執行程序,在main函數執行之前。會調用啟動例程(start-up routine),取得命令行參數和環境變量。能夠把啟動例程理解為exit(main(argc,argv))。

  2. 終止:五種正常終止方式(從main方法返回/exit/_exit/最後一個線程返回/最後一個線程退出)。三種異常終止方式(abort/接收到信號/最後一個線程接收到取消請求)。

  3. exit與_exit關系:exit調用_exit方法通知內核退出程序,之前會進行清理工作,包含調用用戶通過atexit函數註冊的回調方法和標準I/O的fclose函數。

命令行參數和環境變量

main函數原型為:

int main(int argc, char *argv[]);
當中argc為參數個數,argv為參數指針數組,能夠通過下面方法訪問:

for (i = 0; i <argc; i++) /* echo all command-line args */
    printf("argv[%d]: %s\n", i, argv[i]);
環境變量也被傳遞給程序,環境變量定義在全局指針數組中:

extern char **environ;

技術分享

能夠通過getenv/putenv/setenv/unsetenv等函數訪問環境變量

C程序內存布局

技術分享
如圖所看到的:

  1. text:程序正文段,一般是僅僅讀機器指令。
  2. initialized data:顯示初始化的全局變量
  3. bss:名稱為歷史原因(block startedby symbol)。C語言未初始化。由內核初始化為0或者null的全局變量。
  4. heap:堆,動態分配內存。一般向高地址增長。
  5. stack:棧。保存局部變量。函數參數、返回地址等,一般向低地址增長。

  6. 使用size命令能夠輸出text,data,bss段大小。

  7. 大部分系統都支持共享庫,共享庫在內存中僅僅須要存在一份,全部進程都能夠引用它,其長處是能夠減小可運行文件大小,而且共享庫能獨立升級,使用它的程序不用又一次link。

其它重要函數

  1. 內存分配:malloc
    /calloc(分配n個大小同樣的連續空間)/realloc(又一次分配。用於增大或者減小已經分配的內存空間,可能須要移動指針地址)/free(釋放空間,指針的值並不會變成NULL,僅僅是這段內存能夠又一次通過malloc分配)。內存分配通過系統調用sbrk來實現。
  2. 棧定位跳轉:在C程序中使用goto僅僅能在同一個函數內部跳轉。

    setjmp/longjump用於在棧上定位和跳轉,一般用於在多層嵌套函數中進行錯誤處理。

    註意事項:當使用longjmp跳轉後,所到達棧的局部變量和寄存器變量的值是不確定的,它們可能回滾到setjmp之前的狀態。由於編譯器優化後,局部變量和寄存器變量可能位於CPU寄存器上。而位於內存上的靜態變量和volatile變量則沒有這個問題,它們都保持近期一次被改動的值。

  3. 系統資源限制:getrlimit/setrlimit用於獲取設置進程的軟硬資源限制。相應系統命令為ulimit

讀書筆記-APUE第三版-(7)進程環境