Chapter 1. UNIX System
Overview
UNIX 結(jié)構(gòu):
操作系統(tǒng)是控制硬件資源和提供程序運(yùn)行環(huán)境的一種軟件。
系統(tǒng)調(diào)用是訪問內(nèi)核的接口。
Shell是特殊的應(yīng)用程序,提供運(yùn)行其他程序的接口。
登入:
用戶名,/etc/passwd,
shell
文件和目錄:
文件系統(tǒng),文件名,路徑名,工作目錄,Home目錄
輸入和輸出:
文件描述符,標(biāo)準(zhǔn)輸入、輸出、錯(cuò)誤,unbuffered I/O,標(biāo)準(zhǔn)I/O
程序和進(jìn)程:
程序是磁盤上的可執(zhí)行文件,讀入到內(nèi)存中并由內(nèi)核執(zhí)行。
進(jìn)程,進(jìn)程ID,進(jìn)程控制(fork, exec, waitpid),線程和線程id(id只在本進(jìn)程內(nèi)有效)
錯(cuò)誤處理:
當(dāng)函數(shù)執(zhí)行錯(cuò)誤發(fā)生時(shí),將返回一個(gè)負(fù)值,并設(shè)置errno為一個(gè)整數(shù)以提供額外的信息。strerror和perror打印錯(cuò)誤信息。
錯(cuò)誤定義可以分為兩類:致命和非致命的錯(cuò)誤。非致命錯(cuò)誤一般是暫時(shí)的,可以恢復(fù),如缺少資源,就可以延遲一段時(shí)間再重試。
用戶身份:
用戶id,組id,補(bǔ)充組id(一個(gè)用戶可以屬于多個(gè)組中)
信號(hào):
用來通知進(jìn)程有情況發(fā)生的一種技術(shù)。進(jìn)程收到信號(hào)后有三種選擇1,忽略 2,默認(rèn)處理方法 3,自己提供一個(gè)函數(shù)當(dāng)信號(hào)發(fā)生時(shí)調(diào)用。
時(shí)間值:
有兩種:1,日歷時(shí)間time_t 2,進(jìn)程時(shí)間clock_t( clock time, user cpu time, system
cpu time)
日歷時(shí)間可用來記錄文件最后修改的時(shí)間等。
Clock time是此進(jìn)程開始執(zhí)行到終止的時(shí)間,包括了進(jìn)程的切換,以及其他進(jìn)程運(yùn)行的時(shí)間片。
系統(tǒng)調(diào)用和庫:
系統(tǒng)調(diào)用是在內(nèi)核空間中運(yùn)行。庫封裝了系統(tǒng)調(diào)用,運(yùn)行在用戶空間。
Chapter 2. UNIX Standardization and
Implementation
UNIX標(biāo)準(zhǔn)化:
ISO C, IEEE POSIX,Single UNIX
Specification(POSIX的超集)
UNIX系統(tǒng)的實(shí)現(xiàn):
System V (AT&T)
BSD
(Berkeley)
Linux
Mac OS(core is Darwin, combination of Mach kernel and
FreeBSD)
Solaris (Sun, based on System
V)
限制:
由于不同系統(tǒng)的實(shí)現(xiàn)定義了很多magic numbers和常量。為了增強(qiáng)可移植性,需要兩類的限制1,編譯時(shí)的限制2,運(yùn)行時(shí)的限制。處理方法分為三種:1,編譯時(shí)的限制(headers)
2,運(yùn)行時(shí)和文件、目錄無關(guān)的限制(sysconf函數(shù))3,運(yùn)行時(shí)和文件、目錄相關(guān)的限制(pathconf和fpathconf函數(shù))
選項(xiàng):
同樣為了不同系統(tǒng)的代碼可移植性.
1. Compile-time options are defined in
<unistd.h>.
2. Runtime options that are not associated
with a file or a directory are identified with the sysconf function.
3. Runtime options that are associated with a
file or a directory are discovered by calling either the pathconf or the fpathconf function.
特性測試宏:
測試系統(tǒng)是否支持某種特性的宏定義,如__STDC__
原語系統(tǒng)數(shù)據(jù)類型:
<sys/types.h>中定義的數(shù)據(jù)類型。如time_t, off_t, pid_t等。
標(biāo)準(zhǔn)間的沖突:
為了兼容性,很多POSIX的系統(tǒng)實(shí)現(xiàn)了ISO C的函數(shù)。
Chapter 3. File
I/O
文件描述符:
打開文件、創(chuàng)建文件時(shí)返回的值,用來讀、寫、定位文件的標(biāo)識(shí)。
open,creat,close函數(shù):
好像沒什么好說的。要注意open時(shí)一些特殊的文件狀態(tài)標(biāo)記,如O_SYNC,O_NOCTTY等。
lseek函數(shù):
定位文件,可以產(chǎn)生空洞文件。定位可以從頭,從尾,從當(dāng)前位置開始。
Read,write函數(shù):
沒啥好說的。I/O效率根據(jù)自己設(shè)定的buffer大小而不同。因此,調(diào)用read,write的次數(shù)不同,耗去的系統(tǒng)cpu時(shí)間不同。測試時(shí),第一次和之后的測試效率是不同的,因?yàn)?/span>cache的存在。
文件共享:
文件共享是指不同進(jìn)程間打開文件的共享。內(nèi)核通過三種數(shù)據(jù)結(jié)構(gòu)來表示打開的文件,1,每個(gè)進(jìn)程有個(gè)進(jìn)程表項(xiàng),表中是打開文件的描述符向量。每個(gè)向量包含了文件描述符標(biāo)記和一個(gè)指向文件表項(xiàng)的指針;2,內(nèi)核為所有打開的文件維護(hù)一個(gè)文件表,每個(gè)文件表項(xiàng)包括了a,文件狀態(tài)標(biāo)記,如讀、寫、添加、非阻塞等b,當(dāng)前的文件偏移量c,指向文件v-node表項(xiàng)的指針;3,每個(gè)打開文件或設(shè)備都有一個(gè)v-node結(jié)構(gòu)
,包含文件類型和指向操作文件的函數(shù)的指針。
當(dāng)兩個(gè)以上獨(dú)立進(jìn)程打開同一個(gè)文件實(shí)現(xiàn)文件共享時(shí),內(nèi)核維護(hù)不同的文件表項(xiàng),就是兩個(gè)以上進(jìn)程表項(xiàng)中的文件表項(xiàng)指針指向不同的文件表項(xiàng),而不同的文件表項(xiàng)中的v-node指針指向同一個(gè)v-node而實(shí)現(xiàn)文件共享。由于每個(gè)進(jìn)程有自己的打開文件表項(xiàng),所以有自己的文件打開狀態(tài)以及文件偏移量。
原子操作:
為了解決多個(gè)進(jìn)程間共享文件時(shí)讀寫不一致的問題。如多個(gè)進(jìn)程對(duì)同一個(gè)文件添加內(nèi)容,如多個(gè)進(jìn)程創(chuàng)建同一個(gè)文件,如lseek后的write,當(dāng)多個(gè)進(jìn)程同時(shí)執(zhí)行時(shí)就會(huì)使文件寫的內(nèi)容不是預(yù)期的。
函數(shù)pread,pwrite是把lseek和read/write作為原子操作來實(shí)現(xiàn),避免上述問題。
Dup和dup2函數(shù):
復(fù)制描述符,dup是將文件描述符復(fù)制到最小可用的描述符,讓最小可用的描述符指向原描述符所指向的文件表項(xiàng)。
dup2是將指定的文件描述符指向原描述符所指向的文件表項(xiàng)。如果指定的描述符已打開則先關(guān)閉。
Sync,fsync,fdatasync函數(shù):
延遲寫是將排隊(duì)在buffer或page cache中的數(shù)據(jù)過一些時(shí)間再寫到磁盤中。當(dāng)再次用到這些cache時(shí)再寫到磁盤中。
提供這些函數(shù)是將數(shù)據(jù)立即寫到磁盤中,保持文件系統(tǒng)的一致性。Sync和fsync的區(qū)別是,前者不等待數(shù)據(jù)寫到磁盤完成即返回,而后者等待完成后才返回。前者是寫入cache中的所有數(shù)據(jù),系統(tǒng)中的update是daemon進(jìn)程,它調(diào)用sync,并30s中刷新一次。而后者是指定單個(gè)文件刷新數(shù)據(jù),多用于數(shù)據(jù)庫的更新。Fdatasync和fsync類似,但是它只刷新數(shù)據(jù)部分,而不更新文件的屬性。
fcntl函數(shù):
作用是能夠改變打開文件的屬性。根據(jù)參數(shù)不同主要有五種用途:
1, 復(fù)制已存在的描述符
2, 獲得和設(shè)置文件描述符標(biāo)記
3, 獲得和設(shè)置文件狀態(tài)標(biāo)記
4, 獲得和設(shè)置異步I/O的所屬者
5, 獲得和設(shè)置記錄鎖
注意的是:我們在設(shè)置文件描述標(biāo)記或文件狀態(tài)標(biāo)記時(shí),不能只是F_SETFD 或 F_SETFL的fcntl的調(diào)用,而是要先獲得值再設(shè)置值。
文件狀態(tài)標(biāo)記O_SYNC,表示同步寫,每個(gè)write要等待數(shù)據(jù)寫到磁盤上才返回。而在通常情況下write只是將要寫的數(shù)據(jù)排隊(duì),某個(gè)時(shí)刻后才寫到磁盤上。
還提到fcntl這樣的用處,fcntl可以設(shè)置shell打開的標(biāo)準(zhǔn)輸出輸入的屬性,因?yàn)樗灰牢募枋龇湍茏龅轿募傩缘母淖儭?/span>
Iocntl函數(shù):
主要用于終端的I/O和提供本章中提到的函數(shù)無法實(shí)現(xiàn)的功能。如對(duì)磁帶的讀寫和定位的操作。
/dev/fd:
打開/dev/fd/n文件就等于是對(duì)文件描述符dup(n),假定n是已打開的描述符。
即open(”/dev/fd/n”,
mode) ==
dup(n)
Chapter 4. Files and
Directories
stat, fstat, lstat函數(shù):
獲得磁盤上文件的結(jié)構(gòu)信息,由結(jié)構(gòu)stat描述。這些信息應(yīng)該是從文件系統(tǒng)中的inode結(jié)構(gòu)讀出的。包括:文件類型、訪問權(quán)限、大小、所屬用戶id等等信息。
文件類型:
普通文件,目錄文件,符號(hào)鏈接,字符設(shè)備、塊設(shè)備、socket、FIFO。
Set-User-ID和Set-Group-ID:
每個(gè)進(jìn)程有六個(gè)和他相關(guān)聯(lián)的id,真實(shí)用戶id、有效用戶id、保存設(shè)置用戶id以及三個(gè)對(duì)應(yīng)的組id。注意的是這是與進(jìn)程相關(guān)的,以前總是弄混。
真是用戶id是用戶登錄時(shí)使用的id。
一般,有效用戶id=真是用戶id。例外是在文件模式字st_mode中置位一個(gè)特殊標(biāo)記set-user-id,那么有效用戶id就是此進(jìn)程所執(zhí)行的文件所屬者的用戶id。有用的是,判斷一個(gè)文件是否可以被進(jìn)程訪問,是根據(jù)進(jìn)程的有效用戶id是否等于文件所屬的用戶id來的。舉例:普通用戶用程序passwd來修改密碼時(shí),會(huì)訪問到root用戶的文件/etc/passwd和/etc/shadow。為什么能成功,是因?yàn)?/span>passwd是set-user-id程序并且所屬是root,當(dāng)普通用戶執(zhí)行時(shí),它的有效用戶id就變成root,就可以訪問上面兩個(gè)文件。
新建文件和目錄的所屬者:
新文件的用戶id是進(jìn)程的有效用戶id。
而新文件的組id有兩種說法 1.進(jìn)程的有效組id;2. 文件所在的目錄的組id。具體實(shí)現(xiàn),每個(gè)系統(tǒng)有所不同。
access函數(shù):
它的用處是檢測真實(shí)用戶id的訪問文件的權(quán)限,而不管它是否是set-user-id程序。
umask函數(shù):
創(chuàng)建文件時(shí)的屏蔽位,設(shè)置創(chuàng)建的文件的訪問權(quán)限。shell中也有umask命令。
chmod和fchmod函數(shù):
改變已有文件的訪問權(quán)限。
Sticky bit:
作用是在可執(zhí)行程序在第一次執(zhí)行時(shí),程序的代碼段text將復(fù)制到swap空間中。在下次執(zhí)行時(shí),此程序load到內(nèi)存中就很快。如今的unix系統(tǒng),虛擬內(nèi)存以及快速文件系統(tǒng)的出現(xiàn),這項(xiàng)技術(shù)并不需要了。
chown, fchown,
and lchown
Functions:
改變文件的所屬者。大多數(shù)系統(tǒng)中,只有root能改變文件的所屬者。Whether the
owner can be changed depends on the different
systems.
文件大小:
stat結(jié)構(gòu)中的st_size包含文件的字節(jié)大小。但是只對(duì)普通、目錄、符號(hào)鏈接文件有意義。
對(duì)于普通文件,大小為0是允許的。第一次讀就得到end-of-file。
對(duì)于目錄文件,大小通常是16或512的倍數(shù)。
對(duì)于符號(hào)鏈接文件,大小是被鏈接的文件路徑名長度。此外,它不包含C語言中字符串的終止空字符。
stat結(jié)構(gòu)中的st_blksize為文件I/O時(shí)所使用的塊大小。
stat結(jié)構(gòu)中的st_blocks為文件所占的實(shí)際磁盤塊數(shù)。
文件中的洞,當(dāng)文件中有洞時(shí),通過ls –l
core顯示時(shí),會(huì)包含洞所占的字節(jié)數(shù)。而用du
–s
core則顯示文件實(shí)際所占的磁盤塊數(shù)。當(dāng)用read讀文件中洞的內(nèi)容時(shí),得到的是0(不是‘0’而是‘\0’,字符串的結(jié)束符),打印時(shí)將什么都不會(huì)顯示。wc –c
core可以統(tǒng)計(jì)文件中的字節(jié)數(shù)。 經(jīng)驗(yàn)證,在Linux中,雖然是空洞文件,但是空洞仍然占磁盤塊空間。
文件截?cái)啵?/span>
truncation,ftruncation函數(shù)。例外:當(dāng)截?cái)嗟拈L度大于原有文件的長度時(shí),效果依賴于具體的系統(tǒng)。符和XSI的系統(tǒng)文件變長,而變長的部分read出內(nèi)容是0.
文件系統(tǒng):
磁盤可以有多個(gè)分區(qū),每個(gè)分區(qū)可以是不同的文件系統(tǒng)。文件系統(tǒng)主要包含部分:boot
block,super
block,cylinder
group0~n。
每個(gè)cylinder
group中包含:super block
copy,i-node
map,block
bitmap,
i-nodes(一個(gè)文件/目錄一個(gè)),
data/directory blocks(存放文件/目錄的數(shù)據(jù))。
對(duì)于普通文件,i-node指向了所屬文件的數(shù)據(jù)塊。而目錄文件,i-node則指向了所屬目錄的directory
blocks。
每個(gè)directory
block中的主要內(nèi)容是目錄項(xiàng)所包含的文件的i-node號(hào)以及文件名。當(dāng)目錄項(xiàng)包含這樣的信息時(shí),被包含的文件的i-node中stat的成員st_nlink即鏈接數(shù)就增1。這種鏈接就是硬鏈接,通過ln命令實(shí)現(xiàn),即創(chuàng)建一個(gè)新目錄項(xiàng)指向已有的文件。而只有當(dāng)鏈接數(shù)為0的時(shí)候,文件才被刪除。
修改文件名如mv命令,是添加一個(gè)新目錄項(xiàng)指向已有文件,再unlink掉原目錄項(xiàng),而不需要移動(dòng)文件的實(shí)際內(nèi)容。
葉目錄(目錄中不包含任何其他目錄)的鏈接數(shù)是2,分別是目錄中dot,以及父目錄對(duì)它的指向。在葉目錄增加一個(gè)子目錄,則葉目錄的鏈接數(shù)就增1,因?yàn)樾略鲎幽夸浀?/span>dotdot指向它。
link,unlink,remove,rename函數(shù):
通過link創(chuàng)建一個(gè)新的目錄項(xiàng)指向一個(gè)文件,并使鏈接數(shù)增1。這樣多個(gè)目錄項(xiàng)就可以指向同一個(gè)文件。大多數(shù)的系統(tǒng)不允許對(duì)目錄硬鏈接,因?yàn)闀?huì)產(chǎn)生文件系統(tǒng)中的loop。
unlink刪除目錄項(xiàng),鏈接數(shù)減1.參數(shù)是符號(hào)鏈接的話,將移除本身而不是所鏈接的文件。超級(jí)用戶能用unlink去刪除目錄,同rmdir。
remove對(duì)文件來說相當(dāng)于unlink,對(duì)目錄來說是rmdir。
rename的處理情況較多復(fù)雜些。暫時(shí)不去關(guān)注,用到再說。
符號(hào)鏈接:
硬鏈接是直接指向文件的i-node,通過對(duì)i-node的鏈接增加計(jì)數(shù)來實(shí)現(xiàn)的。使用限制有兩點(diǎn)1,鏈接和文件必須在同一個(gè)文件系統(tǒng)中,因?yàn)橛叉溄邮桥ci-node號(hào)相關(guān)的,不同的文件系統(tǒng)中不同文件可能有相同的i-node號(hào)。2,只有超級(jí)用戶才能創(chuàng)建目錄的硬鏈接。
符號(hào)鏈接則是間接指向一個(gè)文件,通過創(chuàng)建新的i-node,i-node指向data
block,data
block內(nèi)容是文件的路徑名。符號(hào)鏈接通常是用來將一個(gè)文件或整個(gè)目錄層次移動(dòng)到系統(tǒng)的另一個(gè)位置。
注意的是,當(dāng)用到文件名作參數(shù)的函數(shù)時(shí),函數(shù)是否follow符號(hào)鏈接。
syslink和readlink函數(shù):
創(chuàng)建符號(hào)鏈接syslink。
open函數(shù)會(huì)follow符號(hào)鏈接,如果要打開符號(hào)鏈接并讀其中的內(nèi)容,則要用readlink。
文件的時(shí)間:
有三種,1,最后訪問時(shí)間 2,最后修改時(shí)間 3,最后i-node狀態(tài)改變時(shí)間。
utime函數(shù)可以修改1,2的時(shí)間,而3的時(shí)間調(diào)用utime時(shí)自動(dòng)更新。
mkdir和rmdir函數(shù)
mkdir創(chuàng)建空的目錄,并自動(dòng)創(chuàng)建dot和dotdot目錄項(xiàng)。注意創(chuàng)建時(shí)mode的權(quán)限除了讀寫外,還要有執(zhí)行,這不同于文件。新目錄的用戶id和組id需要討論。
rmdir則是刪除空目錄。
讀目錄:
有訪問權(quán)限就可讀目錄,而只有內(nèi)核才可以寫目錄。
Chdir, fchdir,getcwd函數(shù)
改變當(dāng)前的工作目錄chdir,fchdir。當(dāng)前工作目錄是進(jìn)程的一個(gè)屬性。它并不影響調(diào)用進(jìn)程的當(dāng)前工作目錄。
Getcwd得到當(dāng)前工作目錄。
Chapter 5. Standard I/O
Library
Streams and FILE
Objects:
就是通過標(biāo)準(zhǔn)庫如fopen打開的返回值指針FILE,使Stream關(guān)聯(lián)到打開的文件。
fwide函數(shù)的作用是改變Stream的模式,是wide-oriented還是byte-oriented。Wide是為了支持國際化字符集,寬字符。
標(biāo)準(zhǔn)輸出、輸入、錯(cuò)誤:
對(duì)應(yīng)文件描述符的有相應(yīng)的流, stdin, stdout, stderr。在stdio.h中有定義。
Buffering:
目的是為了最小化系統(tǒng)調(diào)用read、write的次數(shù)。
分為完全緩沖、行緩沖、無緩沖三種。
完全緩沖:行緩沖的流如果沒有連接到終端設(shè)備上,則是完全緩沖。Stdin和stdout如果被重定位到文件上,則是完全緩沖。
行緩沖:stdin,stdout
無緩沖:stderr
打開流:
Fopen,freopen,fdopen。
讀寫流:
一字節(jié)一次I/O: getc, fgetc, getchar.
Putc,fputc, putchar.其中,getc,putc一般由宏來實(shí)現(xiàn)。
一行一次I/O:gets,fgets,puts,fputs,最好不要使用gets,puts,不安全。造成緩沖區(qū)溢出。
直接I/O(二進(jìn)制I/O):fread,fwrite,結(jié)構(gòu)體的讀寫。以上的幾個(gè)讀寫函數(shù)均不適用,如遇到空字節(jié)在結(jié)構(gòu)體中時(shí),上面函數(shù)的讀寫就無法完成。存在問題,當(dāng)編譯器或系統(tǒng)的不同,結(jié)構(gòu)體字節(jié)對(duì)齊會(huì)造成讀寫不正確;機(jī)器體系結(jié)構(gòu)的不同,二進(jìn)制格式對(duì)多字節(jié)的整數(shù)或浮點(diǎn)數(shù)的存儲(chǔ)也會(huì)不同。
標(biāo)準(zhǔn)I/O的效率:
驗(yàn)證的結(jié)果是,用戶不用去設(shè)定在系統(tǒng)調(diào)用read、write時(shí)所用的緩沖區(qū)大小,在標(biāo)準(zhǔn)I/O中內(nèi)部已經(jīng)自動(dòng)設(shè)定了這樣最佳的buffer,使系統(tǒng)CPU的時(shí)間使用最少。而fgets和fputs中用戶設(shè)定的line buffer的大小只會(huì)影響用戶CPU的時(shí)間。因此,數(shù)據(jù)的copy有兩次:一次在內(nèi)核和標(biāo)準(zhǔn)I/O buffer之間(系統(tǒng)調(diào)用read,write);另一次在標(biāo)準(zhǔn)I/O buffer和我們的行buffer之間。
流的定位:
ftell,fseek,rewind
fgetpos,fsetpos(可移植的)
格式化I/O:
用得最多的是printf,scanf, sprintf, snprintf,
具體的參數(shù)標(biāo)志細(xì)節(jié),用到時(shí)再查。
臨時(shí)文件:
由兩個(gè)函數(shù)生成,tmpnam, tmpfile. 目前作用貌似不大。
Chapter 6. System Data Files and
Information
Password
File:
/etc/passwd文件中包含了各個(gè)用戶的如用戶名、密碼、用戶id、組id等信息。并通過passwd結(jié)構(gòu)來描述。
通過如getpwuid、getpwnam、getpwent函數(shù)來獲得passwd結(jié)構(gòu)。
Shadow Passwords:
出于安全考慮,用戶登錄密碼在/etc/shadow文件中加密。由spwd結(jié)構(gòu)描述。
加密是one-way加密算法,意思是你不能通過加密后的密碼得出原密碼,而只能通過原密碼去驗(yàn)證是否正確。
提供了相似的訪問函數(shù)。但是shadow中的用戶加密密碼是不可讀出的。
Group File,Supplementary Group
ID:
/etc/group文件描述組的信息,并由group結(jié)構(gòu)描述,包括組名、加密密碼、組id、所屬組
的用戶名數(shù)組。
Other Data
Files:
/etc/services;
/etc/protoclos; /etc/networks;
Login
Accounting:
有兩個(gè)相關(guān)的文件:utmp,記錄當(dāng)前所有登錄的用戶。wtmp,記錄所有的登錄和退出。
System
Identification:
主機(jī)號(hào)、操作系統(tǒng)名、版本號(hào)等信息。uname,gethostname來獲取。
Time and Date Routines:
提供一系列的時(shí)間的相關(guān)函數(shù),具有不同的表示方式。有個(gè)不同時(shí)間函數(shù)之間的關(guān)系圖可作
參考。
Chapter 7. Process
Environment
main函數(shù):
在執(zhí)行之前,內(nèi)核通過start-up routine(通常是由匯編編寫的)來執(zhí)行main;
進(jìn)程終止:
多種exit的終止:exit(會(huì)關(guān)閉打開的流), _exit, Exit,還有線程的pthread_exit。
atexit注冊終止時(shí)調(diào)用的函數(shù),按照注冊的順序,反序依次調(diào)用。
shell命令:echo $? 查看程序的返回狀態(tài)。
命令行參數(shù):
沒什么好說的
環(huán)境列表:
很少用到,主要是程序運(yùn)行時(shí)的環(huán)境變量,如:HOME,SHELL,PATH,USER,LOGNAME等。
C程序的內(nèi)存布局:
Text, Data, BSS, Stack, Heap.
Text是程序的代碼段。
Data是程序中初始化了的全局、靜態(tài)數(shù)據(jù)變量。
BSS是程序中未初始化的全局、靜態(tài)數(shù)據(jù)變量。即使全局、靜態(tài)數(shù)據(jù)變量初始化為0仍然是屬于BSS段。
Stack是程序中的局部變量,由高地址到低地址向下增長。
Heap是malloc調(diào)用動(dòng)態(tài)分配的內(nèi)存,由低地址到高地址向上增長。
注意:定義的字符串常量,其中變量算Data,而字符串的大小是屬于Text的。
共享庫:
好處是1.共享,減少可執(zhí)行文件的大小 2.庫更新時(shí),使用庫的每個(gè)程序都不用重新鏈接。
編譯時(shí)用$ cc -static hello1.c 就取消了使用共享庫,編譯出的程序很大。
內(nèi)存分配:
malloc, calloc, realloc
環(huán)境變量:
提供讀取和設(shè)置環(huán)境變量的接口,getenv,setenv。。用處大概就是通過程序來設(shè)置和修改環(huán)境變量。
setjmp和longjmp:
用處是處理有深度嵌套調(diào)用的不同函數(shù)間的錯(cuò)誤情況。用goto只能是本函數(shù)內(nèi)的局部跳轉(zhuǎn),這兩個(gè)函數(shù)就可以在函數(shù)間進(jìn)行跳轉(zhuǎn)。
有問題是跳轉(zhuǎn)會(huì)影響不同類型變量的狀態(tài),對(duì)于沒有優(yōu)化編譯的程序,即使是register變量也是放在內(nèi)存中,因此所有類型的變量仍然得到內(nèi)存中的值。但是優(yōu)化-O編譯的程序,由于自動(dòng)變量、register變量是在寄存器中,當(dāng)執(zhí)行setjmp時(shí),會(huì)從寄存器中讀取數(shù)值,setjmp之后的重新賦值將不起作用。而全局、靜態(tài)、以及volatile變量仍在內(nèi)存中,值不會(huì)受到影響。因此,當(dāng)寫可移植性非局部跳轉(zhuǎn)代碼時(shí),應(yīng)使用volatile屬性。
getrlimit和setrlimit函數(shù):
每個(gè)進(jìn)程都有資源限制的一個(gè)集合。如進(jìn)程可用的總內(nèi)存的大小,core文件的大小,創(chuàng)建文件的最大字節(jié)數(shù)等等。
包括軟限制和硬限制。可以設(shè)置軟限制小于等于硬限制。可以降低硬限制大于等于軟限制但不可逆。只有超級(jí)用戶進(jìn)程才能提升硬限制。
資源限制影響調(diào)用的進(jìn)程,并由子進(jìn)程繼承。一般內(nèi)建到shell中設(shè)置資源限制。
Chapter 8. Process
Control