Linux重點(diǎn)講義_第1頁
Linux重點(diǎn)講義_第2頁
Linux重點(diǎn)講義_第3頁
Linux重點(diǎn)講義_第4頁
Linux重點(diǎn)講義_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Linux復(fù)習(xí)概要文件系統(tǒng):1、 數(shù)據(jù)結(jié)構(gòu)文件邏輯結(jié)構(gòu)與讀寫指針文件物理結(jié)構(gòu)UNIX文件系統(tǒng)采用的是多級索引結(jié)構(gòu)(綜合模式)。每個(gè)文件的索引表為13個(gè)索引項(xiàng),每項(xiàng)2個(gè)字節(jié)。最前面10項(xiàng)直接存放文件信息的物理塊號(直接尋址)。如果文件大于10塊,則利用第11項(xiàng)指向一個(gè)物理塊,該塊中最多可放256個(gè)文件物理塊的塊號(一次間接尋址)。對于更大的文件還可利用第12和第13項(xiàng)作為二次和三次間接尋址。UNIX中采用三級索引結(jié)構(gòu)后,文件最大可達(dá)16兆個(gè)物理塊。分級目錄 i 節(jié)點(diǎn)磁盤i節(jié)點(diǎn)(index node inode )含有對應(yīng)文件的所有說明信息。一個(gè)文件系統(tǒng)的所有磁盤i節(jié)點(diǎn)組成一個(gè)表,保存在超級塊之后

2、的確定地址。每個(gè)節(jié)點(diǎn)按其相對位置順序編號(如 1,2, ),稱為 i 節(jié)點(diǎn)號。 磁盤i節(jié)點(diǎn)的內(nèi)容如下: 。文件主標(biāo)識(shí)號:用戶id(i_uid), 組id(i_gid) 。set_uid位和set_gid位(i_mode) 。文件類型(i_mode) 。文件訪問權(quán)限(i_mode) 。連接數(shù)(i_nlink) 。文件所在物理塊號表(索引表 i_addr) 。文件長度 (i_size) 。文件本身設(shè)備號(特殊文件i_rdev) 。文件創(chuàng)建修改訪問時(shí)間(i_ctime, i_mtime, i_atime) 磁盤分區(qū)和文件系統(tǒng)文件表與內(nèi)存i節(jié)點(diǎn)表 內(nèi)存 i 節(jié)點(diǎn)表為加快文件名在目錄樹中的搜索速度設(shè)立了

3、內(nèi)存 i 節(jié)點(diǎn)表,其中每一項(xiàng)對應(yīng)一個(gè)打開文件。打開文件時(shí)將 i 節(jié)點(diǎn)由磁盤復(fù)制到內(nèi)存 i 節(jié)點(diǎn)表項(xiàng)中,關(guān)閉時(shí)再復(fù)制回磁盤原處。 文件打開時(shí),磁盤i節(jié)點(diǎn)復(fù)制到內(nèi)存i節(jié)點(diǎn)(除時(shí)間信息外),但增加如下內(nèi)容: 。設(shè)備號(所在設(shè)備設(shè)備號i_dev)。i節(jié)點(diǎn)號(所在設(shè)備的 i節(jié)點(diǎn)號i_ino)。訪問計(jì)數(shù) (訪問此內(nèi)存i節(jié)點(diǎn)的進(jìn)程數(shù))。使用狀態(tài):互斥鎖,安裝點(diǎn)標(biāo)志,文件或此節(jié)點(diǎn)是否改寫。指向 flock 結(jié)構(gòu)的指針 文件關(guān)閉時(shí),內(nèi)存i節(jié)點(diǎn)除上述內(nèi)容外的大部分信息復(fù)制到磁盤i節(jié)點(diǎn)上,但增加時(shí)間等信息,整個(gè)系統(tǒng)只有一個(gè)內(nèi)存i節(jié)點(diǎn)表,用以存放系統(tǒng)內(nèi)所有內(nèi)存i節(jié)點(diǎn)。i節(jié)點(diǎn)的大部分內(nèi)容可由 stat() 和 ls 讀

4、取。系統(tǒng)打開文件表 系統(tǒng)打開文件表簡稱系統(tǒng)文件表或文件表,此表整個(gè)系統(tǒng)只有 一個(gè),每項(xiàng)保存有對應(yīng)打開文件的當(dāng)前使用特征。共享此打開文件的各進(jìn)程在自己的打開文件表中各有一表項(xiàng),其中的指針指向該文件的文件表項(xiàng)。各表項(xiàng)內(nèi)容如下: 文件狀態(tài)標(biāo)志: 讀(O_RDONLY),寫(O_WRONLY), 讀寫(O_RDWR), 附加寫(O_APPEND),非阻塞(O_NONBLOCK), 同步(O_SYNC),異步(O_ASYNC)。 它們可由open() 或 fcntl() 設(shè)置修改。當(dāng)前文件位移量(讀寫指針),read/write 由此位移開始向后讀寫文件的數(shù)據(jù)。讀寫打開時(shí)位移量缺省值為0,附加打開時(shí)其值

5、為文件尾,打開后可由lseek() 重新設(shè)置。用戶打開文件表每個(gè)進(jìn)程有一個(gè)用戶打開文件表(或簡稱用戶文件表,描述字表),其大小由內(nèi)核配置時(shí)確定。每一項(xiàng)表示該進(jìn)程的一個(gè)打開文件,表的索引號稱為文件描述字(符)。但描述字0,1,2有專門含義:0:標(biāo)準(zhǔn)輸入,缺省為鍵盤輸入,可重定向?yàn)槿我晃募?:標(biāo)準(zhǔn)輸出,缺省為屏幕輸出,可重定向?yàn)槿我晃募?:出錯(cuò)輸出,指定為為屏幕輸出,不可重定向。 文件描述字(符)可由系統(tǒng)調(diào)用creat,open返回,由dup復(fù)制; 表項(xiàng)內(nèi)容如下: 文件描述字標(biāo)志:目前只有執(zhí)行關(guān)閉標(biāo)志(close-on-exec)。其值為0(缺?。┍硎井?dāng)前進(jìn)程執(zhí)行一目標(biāo)文件時(shí)不關(guān)閉這個(gè)打開文件

6、;1表示執(zhí)行某文件時(shí)關(guān)閉此文件,此標(biāo)志可由fcntl(2)設(shè)置修改。 文件表項(xiàng)指針。文件類型與訪問權(quán)限文件類型(12-15位)及建立的系統(tǒng)調(diào)用: 普通文件 ( IFREG -100000) creat (), mknod() 目錄文件 ( IFDIR - 040000) mkdir() 塊設(shè)備 ( IFBLK - 060000 ) mknod() 字符設(shè)備 ( IFCHR - 020000 ) mknod() 套接口 ( IFSOCK-140000 ) socket() 符號鏈接 ( IFLNK - 120000 ) symlink() 管道/FIFO ( IFIFO - 010000 ) m

7、knod()2、 基本IO函數(shù)打開文件open int open (const char *pathname, int oflag,/* , mode_t mode */);關(guān)閉文件close建立文件creat復(fù)制文件描述字dup讀寫文件read 和 write移動(dòng)文件指針lseek文件控制fcntl int stat ( const char *pathname, struct stat *buf); int lstat ( const char *pathname, struct stat *buf); 返回符號連接信息 int fstat ( int fd, struct stat *b

8、uf); 將文件的信息(來自inode)讀入 buf,ls 命令需要這個(gè)函數(shù)。 struct stat mode_t st_mode; /* 文件類型與訪問許可 */ ino_t st_ino; /* i節(jié)點(diǎn)號 */ dev_t st_dev; /* 所在設(shè)備號 */ dev_t st_rdev; /* 特殊文件設(shè)備號 */ nlink_t st_nlink; /* 連接數(shù) */ uid_t st_uid; /* 文件主用戶id */ gid_t st_gid; /* 文件主組id */ off_t st_size; /* 普通文件規(guī)模(字節(jié)數(shù))*/ time_t st_atime; /* 最

9、近訪問時(shí)間 */ time_t st_mtime; /* 最近修改時(shí)間 */ time_t st_ctime; /* 最近文件狀態(tài)改變時(shí)間 */ long st_blksize; /* 最好的IO塊規(guī)模 */ long st_blocks; /* 512字節(jié)塊數(shù) */;3、 文件與目錄函數(shù)4、 管道特點(diǎn)1. 無文件名2. 先進(jìn)先出(自動(dòng)同步檢查實(shí)現(xiàn))單向3. 臨時(shí)文件4. 同一家族進(jìn)程系統(tǒng)調(diào)用: int pipe(int fds2);返回fds0為讀描述字,fds1為寫描述字5、 文件系統(tǒng)管理文件系統(tǒng)位于一個(gè)磁盤分區(qū)或一個(gè)磁盤內(nèi)。通過mkfs命令或系統(tǒng)調(diào)用可在指定分區(qū)或磁盤上建立一個(gè)文件系統(tǒng)。

10、物理上,一個(gè)文件系統(tǒng)就是由超級塊,i節(jié)點(diǎn)表,目錄和文件數(shù)據(jù)塊的集合;邏輯上,文件系統(tǒng)在用戶面前表現(xiàn)為樹形分級結(jié)構(gòu)(除連接外),最高級為一個(gè)根目錄。分區(qū)或磁盤作為邏輯盤在系統(tǒng)中作為普通設(shè)備看待,它們在/dev目錄下也有文件名,如/dev/dsk1,/dev/fd0等,也有對應(yīng)的i節(jié)點(diǎn),但其中沒有文件索引表,只有設(shè)備號。設(shè)備號包括兩部分:主設(shè)備號和次設(shè)備號,它們分別標(biāo)識(shí)設(shè)備的類別和具體的驅(qū)動(dòng)器號。故設(shè)備號唯一地標(biāo)識(shí)一個(gè)文件系統(tǒng)所在的具體設(shè)備。系統(tǒng)中有一個(gè)磁盤分區(qū)含有根文件系統(tǒng),所以叫做根設(shè)備。系統(tǒng)初啟時(shí)計(jì)算機(jī)首先在這里找到操作系統(tǒng)核心,將其讀入內(nèi)存運(yùn)行。其它分區(qū)上的文件系統(tǒng)可以“安裝”到根文件系統(tǒng)

11、中的一個(gè)目錄上(也叫安裝點(diǎn))。其效果是該目錄邏輯上成為被安裝文件系統(tǒng)的根目錄。于是,這兩個(gè)文件系統(tǒng)便合成為統(tǒng)一的樹形分級結(jié)構(gòu)。其后用戶還可以將該文件系統(tǒng)“拆卸”下來。由于系統(tǒng)安全性的需要,安裝拆卸操作必須由超級用戶執(zhí)行。七、虛擬文件系統(tǒng)*vnode/vfs 最早出現(xiàn)于sun公司的sunnos中(1986),后來被AT&T公司集成到SVR4中。它們采用了面向?qū)ο蟮脑O(shè)計(jì)思想。 vnode ( vitural node,虛擬節(jié)點(diǎn)) 作為一種虛擬節(jié)點(diǎn)有一組統(tǒng)一的接口函數(shù)調(diào)用格式,但對于不同類的i 節(jié)點(diǎn)有著不同的實(shí)現(xiàn)函數(shù)體和私有數(shù)據(jù)。 vnode 相當(dāng)于面向?qū)ο笾械某橄蠡悾峁┏橄蠼涌?,用?/p>

12、派生出各種文件節(jié)點(diǎn)的實(shí)現(xiàn)函數(shù)。這些文件節(jié)點(diǎn)既包括不同文件系統(tǒng)的inode 又包括socket等。 vfs ( vitural file system ,虛擬文件系統(tǒng)) 作為一種虛擬的文件系統(tǒng)有一組統(tǒng)一的接口函數(shù)調(diào)用格式,但對于不同類的文件系統(tǒng)有著不同的實(shí)現(xiàn)函數(shù)和私有數(shù)據(jù)。 vfs 相當(dāng)于面向?qū)ο笾械某橄蠡悾峁┏橄蠼涌?,用于派生出多種文件系統(tǒng)實(shí)現(xiàn),如s5fs,ufs,NFS,FAT32等。 vnode/vfs 體系結(jié)構(gòu)的目標(biāo):同時(shí)支持多種文件系統(tǒng),如Linux類:s5fs, ufs 。非Linux類:FAT32;用戶對所有(在不同分區(qū))安裝的文件系統(tǒng)具有統(tǒng)一的視圖(接口);支持網(wǎng)絡(luò)文件系統(tǒng)

13、(NFS)的共享和透明的訪問;允許廠家將定制的文件系統(tǒng)以模塊方式加入內(nèi)核。進(jìn)程存儲(chǔ)管理:(1)代碼區(qū)(text segment)。加載的是可執(zhí)行文件代碼段,其加載到內(nèi)存中的位置由加載器完成。(2)全局初始化數(shù)據(jù)區(qū)/靜態(tài)數(shù)據(jù)區(qū)(Data Segment)。加載的是可執(zhí)行文件數(shù)據(jù)段,存儲(chǔ)于數(shù)據(jù)段(全局初始化,靜態(tài)初始化數(shù)據(jù))的數(shù)據(jù)的生存周期為整個(gè)程序運(yùn)行過程。(3)未初始化數(shù)據(jù)區(qū)(BSS)。加載的是可執(zhí)行文件BSS段,位置可以分開亦可以緊靠數(shù)據(jù)段,存儲(chǔ)于數(shù)據(jù)段的數(shù)據(jù)(全局未初始化,靜態(tài)未初始化數(shù)據(jù))的生存周期為整個(gè)程序運(yùn)行過程。(4)棧區(qū)(stack)。由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值、返回

14、值、局部變量等。在程序運(yùn)行過程中實(shí)時(shí)加載和釋放,因此,局部變量的生存周期為申請到釋放該段??臻g。(5)堆區(qū)(heap)。用于動(dòng)態(tài)內(nèi)存分配。堆在內(nèi)存中位于BSS區(qū)和棧區(qū)之間。一般由程序員分配和釋放,若程序員不釋放,程序結(jié)束時(shí)有可能由OS回收。棧和堆的區(qū)別(1)管理方式不同。(2)空間大小不同。(3)產(chǎn)生碎片不同。(4)增長方向不同。(5)分配方式不同。(6)分配效率不同。進(jìn)程環(huán)境及進(jìn)程屬性守護(hù)進(jìn)程(Daemon)是運(yùn)行在后臺(tái)的一種特殊進(jìn)程,其脫離于終端,之所以脫離于終端是為了避免進(jìn)程被任何終端所產(chǎn)生的信息所打斷,其在執(zhí)行過程中的信息也不在任何終端上顯示。守候進(jìn)程周期性地執(zhí)行某種任務(wù)或等待處理某些

15、發(fā)生的事件,Linux的大多數(shù)服務(wù)器就是用守護(hù)進(jìn)程實(shí)現(xiàn)的。比如,Internet服務(wù)器inetd,Web服務(wù)器httpd等。一般情況下,守護(hù)進(jìn)程可以通過以下方式啟動(dòng):在系統(tǒng)啟動(dòng)時(shí)由啟動(dòng)腳本啟動(dòng),這些啟動(dòng)腳本通常放在/etc/rc.d目錄下;利用inetd超級服務(wù)器啟動(dòng),如telnet等;由cron定時(shí)啟動(dòng)以及在終端用nohup啟動(dòng)的進(jìn)程也是守護(hù)進(jìn)程。兩類型管道具有以下特點(diǎn):(1)管道是特殊類型的文件,在滿足先入先出的原則條件下可能進(jìn)行讀寫,但不能定位讀寫位置。(2)管道是單向的,要實(shí)現(xiàn)雙向,需要兩個(gè)管道。無名管道只能實(shí)現(xiàn)親緣關(guān)系進(jìn)程間通信(即無名管道的兩個(gè)文件描述符可以被兩者都訪問到),而有名

16、管道以磁盤文件的方式存在,可以實(shí)現(xiàn)本機(jī)任意兩進(jìn)程間通信。(3)無名管道阻塞問題。無名管道無須顯式打開,創(chuàng)建時(shí)直接返回文件描述符,而在讀寫時(shí)需要確實(shí)對方的存在,否則將退出。即如果當(dāng)前進(jìn)程向無名管道的寫數(shù)據(jù)時(shí),必須確定其別一端為某個(gè)進(jìn)程(這個(gè)進(jìn)程可以是當(dāng)前進(jìn)程)擁有,即有一個(gè)(或多個(gè))進(jìn)程的文件描述符表中至少有一個(gè)成員指向管道的另一端(顯然,能夠讀寫管道當(dāng)前端,則本端在當(dāng)前進(jìn)程中是可以訪問的)。如果寫入無名管道的數(shù)據(jù)超過其最大值,寫操作將阻塞,如果管道中沒有數(shù)據(jù),讀操作將阻塞,如果管道發(fā)現(xiàn)另一端斷開(另一端文件描述符關(guān)閉),將自動(dòng)退出。(4)有名管道阻塞問題。有名管道在打開時(shí)需要確實(shí)對方的存在,否

17、則將阻塞。即以讀方式打開某管道,該操作得以繼續(xù)執(zhí)行的條件是:在此之前,已經(jīng)有一個(gè)進(jìn)程以寫的方式打開此管道,否則阻塞,直到條件滿足,因此有名管道將阻塞在打開位置。也可以以讀寫(ORDWR)方式打開有名管道,進(jìn)程能夠繼續(xù)執(zhí)行(不阻塞),只是這樣操作沒有什么意思,即當(dāng)前進(jìn)程讀,當(dāng)前進(jìn)程寫。Linux常見信號與處理 信號的處理流程 (1)信號被某個(gè)進(jìn)程產(chǎn)生,并設(shè)置此信號傳遞的對象(一般為對應(yīng)進(jìn)程的pid),然后傳遞給操作系統(tǒng);(2)操作系統(tǒng)根據(jù)接收進(jìn)程的設(shè)置(是否阻塞)而選擇性的發(fā)送給接收者,如果接收者阻塞該信號(且該信號是可以阻塞的),操作系統(tǒng)將暫時(shí)保留該信號,而不傳遞,直到該進(jìn)程解除對此信號的阻塞

18、(如果對應(yīng)進(jìn)程已經(jīng)退出,則丟棄此信號);如果對應(yīng)進(jìn)程沒有阻塞,操作系統(tǒng)將傳遞此信號;(3)目的進(jìn)程接收到此信號后,將根據(jù)當(dāng)前進(jìn)程對此信號設(shè)置的預(yù)處理方式,暫時(shí)終止當(dāng)前代碼的執(zhí)行,保護(hù)上下文(主要包括臨時(shí)寄存器數(shù)據(jù)、當(dāng)前程序位置以及當(dāng)前CPU的狀態(tài))、轉(zhuǎn)而執(zhí)行中斷服務(wù)程序,執(zhí)行完成后再恢復(fù)到被中斷的位置。當(dāng)然,對于可搶占式內(nèi)核,在中斷返回時(shí)還將引發(fā)新的調(diào)度。信號處理辦法 (1)忽略此信號。大多數(shù)信號都可使用這種方式進(jìn)行處理,但有兩種信號不能被忽略,SIGKILL和SIGSTOP。這兩種信號不能被忽略的原因是:它們向超級用戶提供一種使進(jìn)程終止或停止的可靠方法。(2)捕捉信號。通知內(nèi)核在某種信號發(fā)生

19、時(shí)調(diào)用一個(gè)用戶函數(shù)。在用戶函數(shù)中,可執(zhí)行用戶希望對這種事件進(jìn)行的處理,這需要安裝此信號。例如捕捉到SIGCHLD信號,則表示子進(jìn)程已經(jīng)終止,所以此信號的捕捉函數(shù)可以調(diào)用waitpid()以取得該子進(jìn)程的進(jìn)程PID以及它的終止?fàn)顟B(tài)和資源。(3)執(zhí)行系統(tǒng)默認(rèn)操作。Linux系統(tǒng)對任何一個(gè)信號都規(guī)定了一個(gè)默認(rèn)的操作。 中斷是可以被屏蔽(阻塞)的(部分硬件中斷是必須立即處理的,例如復(fù)位中斷),因此,Linux的信號是可以屏蔽,即阻塞信號。但這與前面提到的忽略是有區(qū)別的。信號忽略:系統(tǒng)仍然傳遞該信號,只是相應(yīng)進(jìn)程對該信號不作任何處理而已。信號阻塞:系統(tǒng)不傳遞該信號,顯示該進(jìn)程無法接收到該信號直到進(jìn)程的信

20、號集發(fā)生改變。System V進(jìn)程間通信Linux系統(tǒng)為每個(gè)IPC機(jī)制都分配了唯一的ID,所有針對該IPC機(jī)制的操作都使用對應(yīng)的ID。因此,通信的雙方都需要通過某個(gè)辦法來獲取ID值。顯然,創(chuàng)建者根據(jù)創(chuàng)建函數(shù)的返回值可獲取該值,但另一個(gè)進(jìn)程如何實(shí)現(xiàn)呢?顯然,Linux兩個(gè)進(jìn)程不能隨意訪問對方的空間(一個(gè)特殊是,子進(jìn)程可以繼承父親進(jìn)程的數(shù)據(jù),實(shí)現(xiàn)父親進(jìn)程向子進(jìn)程的單向傳遞),也就不能夠直接獲取這一ID值。為解決這一問題,IPC在實(shí)現(xiàn)時(shí)約定使用key值做為參數(shù)創(chuàng)建,如果在創(chuàng)建時(shí)使用相同的key值將得到同一個(gè)IPC對象的ID(即一方創(chuàng)建,另一方獲取的是ID),這樣就保證了雙方可以獲取用于傳遞數(shù)據(jù)的IP

21、C機(jī)制ID值。多線程線程自己基本上不擁有系統(tǒng)資源,只擁有少量在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器、一組寄存器、棧、線程信號掩碼、局部線程變量和線程私有數(shù)據(jù)),但是它可與同屬一個(gè)進(jìn)程的其他線程共享進(jìn)程所擁有的全部資源(同一地址空間、通用的信號處理機(jī)制、數(shù)據(jù)與I/O)。進(jìn)程在使用時(shí)占用了大量的內(nèi)存空間,特別是進(jìn)行進(jìn)程間通信時(shí)一定要借助操作系統(tǒng)提供的通信機(jī)制,這使得進(jìn)程有自身的弱點(diǎn),而線程占用資源少,使用靈活,很多應(yīng)用程序中都大量使用線程,而較少的使用多進(jìn)程,但是,線程不能脫離進(jìn)程而存在,另外,線程的層次關(guān)系,執(zhí)行順序并不明顯,對于初學(xué)者大量使用線程會(huì)增加程序的復(fù)雜度。新創(chuàng)建的線程從執(zhí)行用戶定義的函

22、數(shù)處開始執(zhí)行,直到出現(xiàn)以下情況時(shí)退出:調(diào)用pthread_exit函數(shù)退出。調(diào)用pthread_cancel函數(shù)取消該線程。創(chuàng)建線程的進(jìn)程退出或者整個(gè)函數(shù)結(jié)束。其中的一個(gè)線程執(zhí)行了exec類函數(shù)執(zhí)行新的進(jìn)程。取消線程是指取消一個(gè)正在執(zhí)行線程的操作,當(dāng)然,一個(gè)線程能夠被取消并終止執(zhí)行需要滿足以下條件:該線程是否可以被其它取消,這是可以設(shè)置的,在Linux系統(tǒng)下,默認(rèn)是可以被取消的,可用宏分配是PTHREAD_CANCEL_DISABLE和PTHREAD_CANCEL_ENABLE;該線程處于可取消點(diǎn)才能取消。也就是說,該線程被設(shè)置為可以取消狀態(tài),另一個(gè)線程發(fā)起取消操作,該線程并不是一定馬上終止,

23、只能在可取消點(diǎn)才中止執(zhí)行。可以設(shè)置為立即取消和在取消點(diǎn)取消??捎煤隇镻THREAD_CANCEL_DEFERRED和PTHREAD_CANCEL_ASYNCHRONOUS??稍O(shè)置的state的合法值:如果目標(biāo)線程的可取消性狀態(tài)為PTHREAD_CANCEL_DISABLE,則針對目標(biāo)線程的取消請求將處于未決狀態(tài),啟用取消后才執(zhí)行取消請求。如果目標(biāo)線程的可取消性狀態(tài)為PTHREAD_CANCEL_ENABLE,則針對目標(biāo)線程的取消請求將被傳遞。默認(rèn)情況下,在創(chuàng)建某個(gè)線程時(shí),其可取消性狀態(tài)設(shè)置為PTHREAD_CANCEL_ENABLE。pthread_setcanceltype()函數(shù)用來設(shè)置取

24、消類型,即允許取消的線程在接收到取消操作后是立即中止還是在取消點(diǎn)中止,該函數(shù)聲明如下:extern int pthread_setcanceltype (int _type, int *_oldtype)此函數(shù)有兩個(gè)參數(shù),type為調(diào)用線程的可取消性類型所要設(shè)置的值。oldtype為存儲(chǔ)調(diào)用線程原來的可取消性類型的地址。type的合法值包括:如果目標(biāo)線程的可取消性狀態(tài)為PTHREAD_CANCEL_ASYNCHRONOUS,則可隨時(shí)執(zhí)行新的或未決的取消請求。如果目標(biāo)線程的可取消性狀態(tài)為PTHREAD_CANCEL_DEFERRED,則在目標(biāo)線程到達(dá)一個(gè)取消點(diǎn)之前,取消請求將一直處于未決狀態(tài)。在

25、創(chuàng)建某個(gè)線程時(shí),其可取消性類型設(shè)置為PTHREAD_CANCEL_DEFERRED。線程資源線程只擁有少量在運(yùn)行中必不可少的資源,主要包括:程序計(jì)數(shù)器:標(biāo)識(shí)當(dāng)前線程執(zhí)行的位置;一組寄存器:當(dāng)前線程執(zhí)行的上下文內(nèi)容;棧:用于實(shí)現(xiàn)函數(shù)調(diào)用、局部變量。因此,局部變量是私有的;線程信號掩碼:因此可以設(shè)置每線程阻塞的信號,見本書下一章內(nèi)容;局部線程變量:在棧中申請的數(shù)據(jù);線程私有數(shù)據(jù)。見前一小節(jié)介紹。獲取/設(shè)置線程屬性調(diào)度屬性網(wǎng)絡(luò)編程IP數(shù)據(jù)包頭TCP包頭UDP數(shù)據(jù)包頭通信過程首先,服務(wù)器端需要做以下準(zhǔn)備工作:(1)調(diào)用socket()函數(shù)。建立socket對象,指定通信協(xié)議。(2)調(diào)用bind()函數(shù)

26、。將創(chuàng)建的socket對象與當(dāng)前主機(jī)的某一個(gè)IP地和端口綁定。(3)調(diào)用listen()函數(shù)。使socket對象處于監(jiān)聽狀態(tài),并設(shè)置監(jiān)聽隊(duì)列大小??蛻舳诵枰鲆韵聹?zhǔn)備工作:(1)調(diào)用socket()函數(shù)。建立socket()對象,指定相同通信協(xié)議。(2)應(yīng)用程序可以顯式的調(diào)用bind()函數(shù)為其綁定IP地址和端口,當(dāng)然,也可以將這工作交給TCP/IP協(xié)議棧。接著建立通信連接:(1)客戶端調(diào)用connect()函數(shù)。向服務(wù)器端發(fā)出連接請求。(2)服務(wù)端監(jiān)聽到該請求,調(diào)用accept()函數(shù)接受請求,從而建立連接,并返回一個(gè)新的socket文件描述符專門處理該連接。然后通信雙方發(fā)送/接收數(shù)據(jù):(1)服務(wù)器端調(diào)用write()或send()函數(shù)發(fā)送數(shù)據(jù),客戶端調(diào)用read()或者recv()函數(shù)接收數(shù)據(jù)。反之客戶端發(fā)送數(shù)據(jù),服務(wù)器端接收數(shù)據(jù)。(2)通信完成后,通信雙方都需要調(diào)用close()或者shutdown()函數(shù)關(guān)閉socket對象。 Linux系統(tǒng)運(yùn)行級別介紹一.系統(tǒng)運(yùn)行級別介紹 Linux系統(tǒng)有7個(gè)運(yùn)行級別,他們各自的含義是: 第0級 關(guān)閉系統(tǒng) 第1級 單用戶模式 第2級 沒有網(wǎng)絡(luò)多用戶模式 第3級 有網(wǎng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論