麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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

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

  • 一個(gè)C程序的啟動(dòng),以及它的各種終止方式

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

    1. 正文段。這是由CPU執(zhí)行的機(jī)器指令部分。通常,正文段是可由多個(gè)應(yīng)用程序共享的,在存儲(chǔ)器中只需一個(gè)副本。正文段常常是只讀的。
    2. 初始化數(shù)據(jù)段,也稱為數(shù)據(jù)段。包含了程序中需明確地賦初值的變量。
    3. 未初始化數(shù)據(jù)段,也稱為bss段(block started by symbol,由符號(hào)開始的塊)。在程序開始執(zhí)行之前,內(nèi)核將此段中的數(shù)據(jù)初始化為0或空指針。
    4. 棧。自動(dòng)變量以及每次函數(shù)調(diào)用時(shí)所需保存的信息都存放在此段中。
    5. 堆。通常在堆中進(jìn)行動(dòng)態(tài)存儲(chǔ)分配。慣例,堆位于未初始化數(shù)據(jù)段和棧之間。
  • 一種典型安排方式,這是程序的邏輯布局

  • size命令報(bào)告正文段、數(shù)據(jù)段和bss段的長(zhǎng)度(以字節(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列分別是以十進(jìn)制和十六進(jìn)制表示的3段總長(zhǎng)度

6. 共享庫(kù)
  • 共享庫(kù)使得可執(zhí)行文件中不再需要包含公用的庫(kù)函數(shù),而只需要在所有進(jìn)程都可以引用的存儲(chǔ)區(qū)中保存這種庫(kù)例程的一個(gè)副本。減少了每個(gè)可執(zhí)行文件的長(zhǎng)度,但增加了一些運(yùn)行時(shí)間開銷。這種時(shí)間開銷發(fā)生在該程序第一次被執(zhí)行時(shí),或者每個(gè)共享函數(shù)庫(kù)函數(shù)第一次被調(diào)用時(shí)。
  • 另一個(gè)優(yōu)點(diǎn)是可以用庫(kù)函數(shù)的新版本代替老版本而無需對(duì)使用該庫(kù)的程序重新連接編譯。
7. 存儲(chǔ)空間分配
  • ISO C說明了3個(gè)用于存儲(chǔ)空間動(dòng)態(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個(gè)分配函數(shù)所返回的指針一定是適當(dāng)對(duì)齊的,滿足最苛刻的對(duì)齊要求,使其可用于任何數(shù)據(jù)對(duì)象。
  • 返回通用指針void *
  • 這些分配例程通常用sbrk系統(tǒng)調(diào)用實(shí)現(xiàn)。該系統(tǒng)調(diào)用擴(kuò)充或縮小進(jìn)程的堆。雖然sbrk可以擴(kuò)充或縮小進(jìn)程的存儲(chǔ)空間,但是大多數(shù)malloc和free的實(shí)現(xiàn)都不減少進(jìn)程的存儲(chǔ)空間。釋放的空間可供以后再分配,將它們保持在malloc池中而不返回給內(nèi)核。
  • 大多數(shù)實(shí)現(xiàn)所分配的存儲(chǔ)空間比所要求的要稍大一些,額外的空間用來記錄管理信息——分配塊的長(zhǎng)度、指向下一個(gè)分配塊的指針等。
  • 常見錯(cuò)誤:1. 釋放一個(gè)已經(jīng)釋放了的塊;2. 調(diào)用free時(shí)所用的指針不是3個(gè)alloc函數(shù)的返回值;3. 忘記調(diào)用free造成內(nèi)存泄露。
8. 替代的存儲(chǔ)空間分配程序
  • libmalloc
  • vmalloc
  • quick-fit,歷史上所使用的標(biāo)準(zhǔn)malloc算法是最佳適配或首次適配存儲(chǔ)分配策略。quick-fit算法比上述兩種快,但可能使用較多存儲(chǔ)空間
  • jemalloc
  • TCMalloc,高性能、高擴(kuò)展性和高存儲(chǔ)效率。開源,是Google-perftools工具中的一個(gè)
  • 函數(shù)alloca,在當(dāng)前函數(shù)的棧幀上分配存儲(chǔ)空間,而不是在堆上。

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

9. 環(huán)境變量
  • Unix內(nèi)核并不查看這些字符串,它們的解釋完全取決于各個(gè)應(yīng)用程序。
  • 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); // 當(dāng)name已存在時(shí),根據(jù)rewrite參數(shù)而覆蓋或保持原值
  5. int unsetenv(const char *name); // 即使name不存在也不算出錯(cuò)
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 羞羞视频在线免费 | 欧美一级毛片特黄黄 | 精国产品一区二区三区四季综 | 久久99综合 | 国产69精品久久久久久久久久 | 欧美在线黄色 | 九九热这里只有精品8 | 久久久一区二区三区视频 | 一级色毛片 | 中文字幕一二三区芒果 | 午夜视频久久 | 欧美日韩大片在线观看 | 97黄色网 | 91精品免费在线 | 国产精品久久久久久久久久 | 一级大片视频 | 香蕉视频破解 | 午夜视频色 | 免费网站看毛片 | 亚洲生活片 | 中文字幕一区二区三区四区 | 欧美日韩中文字幕在线视频 | 中文字幕涩涩久久乱小说 | a一级黄色大片 | 国产九色视频在线观看 | 久久成人综合视频 | 成人在线视频精品 | 欧美成人免费电影 | av免费不卡国产观看 | 精国品产一区二区三区有限公司 | 国产人妖一区二区 | 美国一级黄色毛片 | 极品国产91在线网站 | 久久精品4 | 精品亚洲午夜久久久久91 | 精品久久久久久久久久久久久久 | av视在线| 国人精品视频在线观看 | 91短视频在线播放 | 亚洲天堂ww | 99日韩精品视频 |