<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 134,comments - 22,trackbacks - 0

    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),線程和線程idid只在本進(jìn)程內(nèi)有效)

     

    錯(cuò)誤處理:

    當(dāng)函數(shù)執(zhí)行錯(cuò)誤發(fā)生時(shí),將返回一個(gè)負(fù)值,并設(shè)置errno為一個(gè)整數(shù)以提供額外的信息。strerrorperror打印錯(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 POSIXSingle UNIX Specification(POSIX的超集)

     

    UNIX系統(tǒng)的實(shí)現(xiàn):

    System V AT&T

    BSD  (Berkeley)

    Linux

    Mac OScore 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)的限制(pathconffpathconf函數(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_SYNCO_NOCTTY等。

    lseek函數(shù):

    定位文件,可以產(chǎn)生空洞文件。定位可以從頭,從尾,從當(dāng)前位置開始。

     

    Readwrite函數(shù):

    沒啥好說的。I/O效率根據(jù)自己設(shè)定的buffer大小而不同。因此,調(diào)用readwrite的次數(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ù)preadpwrite是把lseekread/write作為原子操作來實(shí)現(xiàn),避免上述問題。

     

    Dupdup2函數(shù):

    復(fù)制描述符,dup是將文件描述符復(fù)制到最小可用的描述符,讓最小可用的描述符指向原描述符所指向的文件表項(xiàng)。

    dup2是將指定的文件描述符指向原描述符所指向的文件表項(xiàng)。如果指定的描述符已打開則先關(guān)閉。

     

    Syncfsyncfdatasync函數(shù):

    延遲寫是將排隊(duì)在bufferpage cache中的數(shù)據(jù)過一些時(shí)間再寫到磁盤中。當(dāng)再次用到這些cache時(shí)再寫到磁盤中。

    提供這些函數(shù)是將數(shù)據(jù)立即寫到磁盤中,保持文件系統(tǒng)的一致性。Syncfsync的區(qū)別是,前者不等待數(shù)據(jù)寫到磁盤完成即返回,而后者等待完成后才返回。前者是寫入cache中的所有數(shù)據(jù),系統(tǒng)中的updatedaemon進(jìn)程,它調(diào)用sync,并30s中刷新一次。而后者是指定單個(gè)文件刷新數(shù)據(jù),多用于數(shù)據(jù)庫的更新。Fdatasyncfsync類似,但是它只刷新數(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_SETFLfcntl的調(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è)備、socketFIFO

     

    Set-User-IDSet-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>passwdset-user-id程序并且所屬是root,當(dāng)普通用戶執(zhí)行時(shí),它的有效用戶id就變成root,就可以訪問上面兩個(gè)文件。

     

    新建文件和目錄的所屬者:

    新文件的用戶id是進(jìn)程的有效用戶id

    而新文件的組id有兩種說法 1.進(jìn)程的有效組id2. 文件所在的目錄的組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命令。

     

    chmodfchmod函數(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ì)于目錄文件,大小通常是16512的倍數(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>

    truncationftruncation函數(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 blocksuper blockcylinder group0n

    每個(gè)cylinder group中包含:super block copyi-node mapblock 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-nodestat的成員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-nodei-node指向data blockdata block內(nèi)容是文件的路徑名。符號(hào)鏈接通常是用來將一個(gè)文件或整個(gè)目錄層次移動(dòng)到系統(tǒng)的另一個(gè)位置。

    注意的是,當(dāng)用到文件名作參數(shù)的函數(shù)時(shí),函數(shù)是否follow符號(hào)鏈接。

     

    syslinkreadlink函數(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ù)可以修改12的時(shí)間,而3的時(shí)間調(diào)用utime時(shí)自動(dòng)更新。

     

    mkdirrmdir函數(shù)

    mkdir創(chuàng)建空的目錄,并自動(dòng)創(chuàng)建dotdotdot目錄項(xiàng)。注意創(chuàng)建時(shí)mode的權(quán)限除了讀寫外,還要有執(zhí)行,這不同于文件。新目錄的用戶id和組id需要討論。

    rmdir則是刪除空目錄。

     

    讀目錄:

    有訪問權(quán)限就可讀目錄,而只有內(nèi)核才可以寫目錄。

     

    Chdir, fchdir,getcwd函數(shù)

    改變當(dāng)前的工作目錄chdirfchdir。當(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-orientedWide是為了支持國際化字符集,寬字符。

     

    標(biāo)準(zhǔn)輸出、輸入、錯(cuò)誤:

    對(duì)應(yīng)文件描述符的有相應(yīng)的流, stdin, stdout, stderr。在stdio.h中有定義。

     

    Buffering:

    目的是為了最小化系統(tǒng)調(diào)用readwrite的次數(shù)。

    分為完全緩沖、行緩沖、無緩沖三種。

    完全緩沖:行緩沖的流如果沒有連接到終端設(shè)備上,則是完全緩沖。Stdinstdout如果被重定位到文件上,則是完全緩沖。

    行緩沖:stdinstdout

    無緩沖:stderr

     

    打開流:

    Fopenfreopenfdopen

     

    讀寫流:

    一字節(jié)一次I/O: getc, fgetc, getchar. Putcfputc, putchar.其中,getcputc一般由宏來實(shí)現(xiàn)。

    一行一次I/Ogetsfgetsputsfputs,最好不要使用getsputs,不安全。造成緩沖區(qū)溢出。

    直接I/O(二進(jìn)制I/O)freadfwrite,結(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)用readwrite時(shí)所用的緩沖區(qū)大小,在標(biāo)準(zhǔn)I/O中內(nèi)部已經(jīng)自動(dòng)設(shè)定了這樣最佳的buffer,使系統(tǒng)CPU的時(shí)間使用最少。而fgetsfputs中用戶設(shè)定的line buffer的大小只會(huì)影響用戶CPU的時(shí)間。因此,數(shù)據(jù)的copy有兩次:一次在內(nèi)核和標(biāo)準(zhǔn)I/O buffer之間(系統(tǒng)調(diào)用readwrite);另一次在標(biāo)準(zhǔn)I/O buffer和我們的行buffer之間。

     

    流的定位:

    ftellfseekrewind

    fgetposfsetpos(可移植的)

     

    格式化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)來描述。

    通過如getpwuidgetpwnamgetpwent函數(shù)來獲得passwd結(jié)構(gòu)。

     

    Shadow Passwords

    出于安全考慮,用戶登錄密碼在/etc/shadow文件中加密。由spwd結(jié)構(gòu)描述。

    加密是one-way加密算法,意思是你不能通過加密后的密碼得出原密碼,而只能通過原密碼去驗(yàn)證是否正確。

    提供了相似的訪問函數(shù)。但是shadow中的用戶加密密碼是不可讀出的。

     

    Group FileSupplementary 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)等信息。unamegethostname來獲取。

     

    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)境變量,如:HOMESHELLPATHUSERLOGNAME等。

     

    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是程序中的局部變量,由高地址到低地址向下增長。

    Heapmalloc調(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)境變量的接口,getenvsetenv。。用處大概就是通過程序來設(shè)置和修改環(huán)境變量。

     

    setjmplongjmp

    用處是處理有深度嵌套調(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屬性。

     

    getrlimitsetrlimit函數(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

    posted on 2010-07-29 16:26 何克勤 閱讀(1464) 評(píng)論(0)  編輯  收藏 所屬分類: GNU Linux/Unix
    主站蜘蛛池模板: 亚洲综合中文字幕无线码| 亚洲男人av香蕉爽爽爽爽| 91九色视频无限观看免费| 国产免费无码一区二区| 国产国产人免费人成成免视频| 免费一级特黄特色大片| 无码免费又爽又高潮喷水的视频 | 亚洲国产精品国自产电影| 国产亚洲人成网站在线观看不卡| 亚洲中文字幕无码久久2017| 国产亚洲日韩一区二区三区| 在线亚洲人成电影网站色www| 亚洲人成77777在线播放网站| 国产精品亚洲A∨天堂不卡| 久久久久亚洲精品影视| 久久亚洲春色中文字幕久久久| 亚洲精品91在线| 中文字幕乱码亚洲无线三区 | 亚洲三级视频在线| 亚洲成人激情小说| 亚洲人AV在线无码影院观看| 国产成人亚洲毛片| 中文字幕免费观看全部电影| 99爱在线观看免费完整版| 最近2019免费中文字幕6| 97在线线免费观看视频在线观看| 日韩成人免费aa在线看| 亚洲毛片网址在线观看中文字幕| 亚洲男同帅GAY片在线观看| 78成人精品电影在线播放日韩精品电影一区亚洲 | 黄网站色在线视频免费观看| 成年女人免费视频播放77777| 国产亚洲精品免费| 中文字幕一精品亚洲无线一区| 亚洲a在线视频视频| 成人亚洲国产va天堂| 性生大片视频免费观看一级| 99热在线免费观看| 黄网址在线永久免费观看 | 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲精品无码av人在线观看|