環境變量 - 存儲在內存中的信息,格式是映射,做用就是 幫助系統 進行一些工做,通常是 查找某個東西。
預處理指令:#warning #error #pragma程序員
使用程序直接調用庫文件的函數(動態編程)
#include <dlfcn.h>
1 用dlopen打開一個庫文件,返回void*
2 用dlsym按函數名打開一個函數,返回函數指針
3 使用函數指針
4 用dlclose 關閉庫文件。
5 dlerror函數判斷是否出錯,!=NULL 出錯
注:dlopen時,flag能夠設置延遲加載
RTLD_LAZY - 延遲
RTLD_NOW - 馬上加載 編程
C程序員的錯誤處理(針對全部的代碼)
什麼是錯誤處理?
程序中有正確的分支和錯誤的分支,關於錯誤的狀況如何處理,就是 錯誤處理。錯誤處理的代碼不影響錯誤是否發生。
C程序員處理錯誤的方式:(常規方式)
1 返回-1表明錯誤。
a 若是-1不是函數的有效返回值,直接返回-1表明錯誤。
b 若是-1 是函數的有效返回值,用-1表明錯誤,用指針 取返回值。
2 返回NULL 表明錯誤。
通常來講,返回值是 指針類型時,用NULL表明錯誤。
3 不須要考慮錯誤處理的函數 返回void數組
C語言中沒有string,字符串用兩種方式表示:(*)
char* s1;
char s2[20];
其中,s1能夠用 = 賦值,s2只能用=初始化,不能用 = 賦值,s2的賦值使用strcpy函數。
若是s1 = "aaa";(字面值),不支持strcpy。
經常使用的字符串函數:
strcpy - 賦值
strlen - 取長度
strcat - 追加內容
strcmp - 比較兩個字符串(一般斷定字符串相同)
strncmp - 比較兩個字符串的前n個字符 函數
C語言對錯誤的處理也有支持,主要是:
定義了一個全局變量errno,存儲錯誤的編號。
定義了 strerror/perror/printf("%m")三個函數轉換錯誤編號和錯誤信息,後兩個能夠自動打印。
注:不是全部的函數都使用errno處理錯誤。 操作系統
環境變量和環境表在程序中的使用
C語言中,提供了環境表變量environ 存儲 環境變量的各類信息,類型是 一個 char**(字符指針數組),須要extern。environ存儲的是 首地址。
Unix/Linux的內存管理(明天繼續)
STL - 內存自動分配和回收
|
C++ - new分配 delete回收
|
C - malloc分配 free回收
|
Linux系統函數 - brk/sbrk
|
Linux系統函數 - mmap分配 /munmap回收 (用戶層)
——————————————————————
kmalloc vmalloc 等 (內核層/系統層)
Unix/Linux內存管理機制:
虛擬內存地址 - 在Unix/Linux中,每一個進程都有0-4G的虛擬內存地址(其實就是數字)。虛擬內存地址必須映射到物理內存/硬盤文件空間上 才能存儲數據。若是虛擬內存地址 沒有 映射物理內存/文件,會產生 段錯誤/總線錯誤。內存分配 就是 把一部分虛擬內存地址和物理內存 映射起來。程序員看到的都是 虛擬內存地址。
其中0-3G是用戶使用的,叫用戶空間,3G-4G是操做系統使用的,叫內核空間。用戶空間不能直接進內核空間,但能夠經過 系統函數(系統調用) 進入內核空間。
內存的分配和回收不是 以 一個字節做爲單位,以 一個內存頁(4096字節 4k) 做爲單位。
Unix/Linux的進程和程序:
程序 就是 可執行的文件(硬盤上的)
進程 就是 正在運行的程序(內存中的)
內存針對的是進程,進程內存空間的組成:
1 代碼區 - 存函數的代碼,函數所在區,只讀區
2 全局區 - 存全局變量和static變量 讀寫區
3 BSS段 - 存未初始化的全局變量,在main執行前bss段 自動清0.
4 棧區 - 局部變量,函數參數,內存自動管理
5 堆區 - 自由區,malloc new分配的內存,堆區的內存用 free/delete 回收,不然內存泄漏。
注:代碼區附近有一個 常量和字符串常量區,存常量和字符串字面值("aa"),也是 只讀區,但 併入代碼區。指針