a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 系統(tǒng) > Unix > 正文

《Unix環(huán)境高級編程》讀書筆記 第7章-進程環(huán)境

2024-06-28 13:24:48
字體:
來源:轉載
供稿:網(wǎng)友
《Unix環(huán)境高級編程》讀書筆記 第7章-進程環(huán)境1. main函數(shù)
  • int main( int argc, char *argv[] );
  • argc是命令行參數(shù)的數(shù)目,包括程序名在內(nèi)
  • argv是指向參數(shù)的各個指針所構成的數(shù)組,即指針數(shù)組
  • 當內(nèi)核執(zhí)行C程序時(使用exec函數(shù)),在調用main前先調用一個特殊的啟動例程。可執(zhí)行程序文件將此啟動例程指定為程序的起始地址——這是由連接器設置的,而連接器則是由C編譯器調用。啟動例程從內(nèi)核取得命令行參數(shù)和環(huán)境變量值,然后按上述方式調用main函數(shù)做好安排。
2. 進程終止
  • 有8種方式使進程終止,其中5種為正常終止
    1. 從main返回
    2. 調用exit
    3. 調用_exit或_Exit
    4. 最后一個線程從其啟動例程返回
    5. 從最后一個線程調用pthread_exit
  • 異常終止有3種方式:
    1. 調用abort
    2. 接到一個信號
    3. 最后一個線程對取消請求做出響應
2.1 退出函數(shù)
  1. #include <stdlib.h>
  2. void exit(int status);
  3. void _Exit(int status);
  4. #include <unistd.h>
  5. void _exit(int status);
  • _exit(由POSIX.1說明)和_Exit(由ISO C說明)立即進入內(nèi)核,而exit(由ISO C說明)則先執(zhí)行一些清理處理,然后返回內(nèi)核。
  • 3個退出函數(shù)都帶一個整型參數(shù),稱為終止狀態(tài)退出狀態(tài)。大多數(shù)Unix系統(tǒng)shell都提供檢測進程終止狀態(tài)的方法。
  • 下面幾種情況下,該進程的終止狀態(tài)是未定義的:
    1. 調用這些函數(shù)時不帶終止狀態(tài)
    2. main執(zhí)行了一個無返回值的return語句
    3. main沒有聲明返回類型為整型
2.2 函數(shù)atexit
  1. #include <stdlib.h>
  2. int atexit(void (*func)(void)); // 參數(shù)是一個函數(shù)指針
  3. Returns: 0 if OK, nonzero on error
  • 按照ISO C的規(guī)定,一個進程可以登記多至32個函數(shù),這些函數(shù)將由exit自動調用。稱這些函數(shù)為終止處理程序
  • exit首先調用各終止處理程序,然后關閉所有打開流。exit調用這些函數(shù)的順序與它們登記的順序相反。
  • 如若程序調用exec函數(shù),則將清除所有已安裝的終止處理程序。
  • 注意:內(nèi)核使程序執(zhí)行的唯一方法是調用一個exec函數(shù)。進程自愿終止的唯一方法是顯式或隱式(通過調用exit)地調用_exit或_Exit。進程也可非自愿地由一個信號使其終止。

  • 一個C程序的啟動,以及它的各種終止方式

3. 命令行參數(shù)
  • 當執(zhí)行一個程序時,調用exec的進程可將命令行參數(shù)傳遞給新程序。這是Unix shell的一部分常規(guī)操作。
4. 環(huán)境表
  • extern char **environ;稱environ為環(huán)境指針;指針數(shù)組為環(huán)境表,其中各指針指向的字符串為環(huán)境字符串
5. C 程序的存儲空間布局
  • 歷史沿襲至今,C程序一直由以下幾部分組成:

    1. 正文段。這是由CPU執(zhí)行的機器指令部分。通常,正文段是可由多個應用程序共享的,在存儲器中只需一個副本。正文段常常是只讀的。
    2. 初始化數(shù)據(jù)段,也稱為數(shù)據(jù)段。包含了程序中需明確地賦初值的變量。
    3. 未初始化數(shù)據(jù)段,也稱為bss段(block started by symbol,由符號開始的塊)。在程序開始執(zhí)行之前,內(nèi)核將此段中的數(shù)據(jù)初始化為0或空指針。
    4. 棧。自動變量以及每次函數(shù)調用時所需保存的信息都存放在此段中。
    5. 堆。通常在堆中進行動態(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段總長度

6. 共享庫
  • 共享庫使得可執(zhí)行文件中不再需要包含公用的庫函數(shù),而只需要在所有進程都可以引用的存儲區(qū)中保存這種庫例程的一個副本。減少了每個可執(zhí)行文件的長度,但增加了一些運行時間開銷。這種時間開銷發(fā)生在該程序第一次被執(zhí)行時,或者每個共享函數(shù)庫函數(shù)第一次被調用時。
  • 另一個優(yōu)點是可以用庫函數(shù)的新版本代替老版本而無需對使用該庫的程序重新連接編譯。
7. 存儲空間分配
  • ISO C說明了3個用于存儲空間動態(tài)分配的函數(shù)

    malloc,初始值不確定calloc,每一位都初始化為0realloc,新增區(qū)域內(nèi)的初始值不確定

  1. #include <stdlib.h>
  2. void *malloc(size_t size);
  3. void *calloc(size_t nobj, size_t size);
  4. void *realloc(void *ptr, size_t newsize);
  5. All three return: non-null pointer if OK, NULL on error
  6. void free(void *ptr);
  • 這3個分配函數(shù)所返回的指針一定是適當對齊的,滿足最苛刻的對齊要求,使其可用于任何數(shù)據(jù)對象。
  • 返回通用指針void *
  • 這些分配例程通常用sbrk系統(tǒng)調用實現(xiàn)。該系統(tǒng)調用擴充或縮小進程的堆。雖然sbrk可以擴充或縮小進程的存儲空間,但是大多數(shù)malloc和free的實現(xiàn)都不減少進程的存儲空間。釋放的空間可供以后再分配,將它們保持在malloc池中而不返回給內(nèi)核。
  • 大多數(shù)實現(xiàn)所分配的存儲空間比所要求的要稍大一些,額外的空間用來記錄管理信息——分配塊的長度、指向下一個分配塊的指針等。
  • 常見錯誤:1. 釋放一個已經(jīng)釋放了的塊;2. 調用free時所用的指針不是3個alloc函數(shù)的返回值;3. 忘記調用free造成內(nèi)存泄露。
8. 替代的存儲空間分配程序
  • libmalloc
  • vmalloc
  • quick-fit,歷史上所使用的標準malloc算法是最佳適配或首次適配存儲分配策略。quick-fit算法比上述兩種快,但可能使用較多存儲空間
  • jemalloc
  • TCMalloc,高性能、高擴展性和高存儲效率。開源,是Google-perftools工具中的一個
  • 函數(shù)alloca,在當前函數(shù)的棧幀上分配存儲空間,而不是在堆上。

    優(yōu)點:當函數(shù)返回時,自動釋放它所使用的棧幀,不再需要自己釋放空間缺點:alloca函數(shù)增加了棧幀的長度,而某些系統(tǒng)在函數(shù)已經(jīng)被調用后不能增加棧幀長度,于是也就不能支持alloca函數(shù)。本書4個平臺均支持該函數(shù)。

9. 環(huán)境變量
  • Unix內(nèi)核并不查看這些字符串,它們的解釋完全取決于各個應用程序。
  • LANG、PATH、HOME、PWD、TERM ...
  1. #include <stdlib.h>
  2. char *getenv(const char *name);
  3. Returns: pointer to value associated with name, NULL if not found
  1. #include <stdlib.h>
  2. int putenv(char *str); // name已存在,替換
  3. Returns: 0 if OK, nonzero on error
  4. int setenv(const char *name, const char *value, int rewrite); // 當name已存在時,根據(jù)rewrite參數(shù)而覆蓋或保持原值
  5. int unsetenv(const char *name); // 即使name不存在也不算出錯
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 天天干天天躁 | 999国内精品永久免费视频 | 久久久久久九九 | 欧美黄色a视频 | 日韩精品一区二区三区在线播放 | 精品国产乱码久久久久久免费 | 亚洲精品视频国产 | 久久国产精品精品国产 | 毛片网站在线观看 | 91久久久久久久久久久久久久久久 | 午夜男人天堂 | 午夜剧场黄 | 国产精品视频网站 | 亚洲日本三级 | 久久久久久久久久久久久久av | 日韩精品专区在线影院重磅 | 久久亚洲欧美日韩精品专区 | 成人午夜精品一区二区三区 | 国产一区亚洲 | 婷婷午夜激情 | 国产精品不卡视频 | 欧美视频第一页 | 黄色在线免费观看视频网站 | 免费黄色在线观看 | 欧美成人免费视频 | 日韩啊啊啊 | 欧美精品一区二区三区在线 | 欧美日韩二区三区 | 黄色激情av | 91精品蜜臀一区二区三区在线 | 日韩精品久久久免费观看夜色 | av官网| 国产激情网站 | 综合色婷婷一区二区亚洲欧美国产 | 欧美日本国产欧美日本韩国99 | 中文无码日韩欧 | 国产精品久久久 | 黄毛片 | 欧美一区二区在线播放 | 久久黄视频| 四季久久免费一区二区三区四区 |