第13講Linux文件IO編程_第1頁
第13講Linux文件IO編程_第2頁
第13講Linux文件IO編程_第3頁
第13講Linux文件IO編程_第4頁
第13講Linux文件IO編程_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第13講 Linux文件I/O編程主要內(nèi)容13.1 Linux中文件及文件描述符概述13.2 底層文件I/O操作13.3 嵌入式Linux串口應(yīng)用編程 13.4 標(biāo)準(zhǔn)I/O編程 13.5 實驗 13.1 Linux中文件及文件描述符概述文件描述符內(nèi)核如何區(qū)分和引用特定的文件呢?這里用到了一個重要的概念文件描述符。對于Linux而言,所有對設(shè)備和文件的操作都是使用文件描述符來進行的。文件描述符是一個非負(fù)的整數(shù),它是一個索引值,并指向在內(nèi)核中每個進程打開文件的記錄表。當(dāng)打開一個現(xiàn)存文件或創(chuàng)建一個新文件時,內(nèi)核就向進程返回一個文件描述符;當(dāng)需要讀寫文件時,也需要把文件描述符作為參數(shù)傳遞給相應(yīng)的函數(shù)。

2、通常,一個進程啟動時,都會打開3個文件:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)出錯處理。這3個文件分別對應(yīng)文件描述符為0、1和2(也就是宏替換STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO)。 13.2 底層文件I/O操作 函數(shù)說明 open()函數(shù)是用于打開或創(chuàng)建文件,在打開或創(chuàng)建文件時可以指定文件的屬性及用戶的權(quán)限等各種參數(shù)。close()函數(shù)是用于關(guān)閉一個被打開的文件。當(dāng)一個進程終止時,所有被它打開的文件都由內(nèi)核自動關(guān)閉,很多程序都使用這一功能而不顯示地關(guān)閉一個文件。read()函數(shù)是用于將從指定的文件描述符中讀出的數(shù)據(jù)放到緩存區(qū)中,并返回實際讀入的字節(jié)數(shù)。若返回0,

3、則表示沒有數(shù)據(jù)可讀,即已達到文件尾。讀操作從文件的當(dāng)前指針位置開始。當(dāng)從終端設(shè)備文件中讀出數(shù)據(jù)時,通常一次最多讀一行。write()函數(shù)是用于向打開的文件寫數(shù)據(jù),寫操作從文件的當(dāng)前指針位置開始。對磁盤文件進行寫操作,若磁盤已滿或超出該文件的長度,則write()函數(shù)返回失敗。lseek()函數(shù)是用于在指定的文件描述符中將文件指針定位到相應(yīng)的位置。它只能用在可定位(可隨機訪問)文件操作中。管道、套接字和大部分字符設(shè)備文件是不可定位的,所以在這些文件的操作中無法使用lseek()調(diào)用。 函數(shù)格式(1)函數(shù)格式(2)函數(shù)格式(3)示例閱讀代碼并運行示例6-3-1文件鎖 文件鎖包括建議性鎖和強制性鎖。

4、建議性鎖要求每個上鎖文件的進程都要檢查是否有鎖存在,并且尊重已有的鎖。在一般情況下,內(nèi)核和系統(tǒng)都不使用建議性鎖。強制性鎖是由內(nèi)核執(zhí)行的鎖,當(dāng)一個文件被上鎖進行寫入操作的時候,內(nèi)核將阻止其他任何文件對其進行讀寫操作。采用強制性鎖對性能的影響很大,每次讀寫操作都必須檢查是否有鎖存在。在Linux中,實現(xiàn)文件上鎖的函數(shù)有l(wèi)ockf()和fcntl(),其中l(wèi)ockf()用于對文件施加建議性鎖,而fcntl()不僅可以施加建議性鎖,還可以施加強制鎖。同時,fcntl()還能對文件的某一記錄上鎖,也就是記錄鎖。記錄鎖又可分為讀取鎖和寫入鎖,其中讀取鎖又稱為共享鎖,它能夠使多個進程都能在文件的同一部分建立

5、讀取鎖。而寫入鎖又稱為排斥鎖,在任何時刻只能有一個進程在文件的某個部分上建立寫入鎖。當(dāng)然,在文件的同一部分不能同時建立讀取鎖和寫入鎖。fcntl()函數(shù)格式(1) fcntl()函數(shù)格式(2)- flock結(jié)構(gòu)struct flock short l_type; off_t l_start; short l_whence; off_t l_len; pid_t l_pid;示例閱讀代碼并運行示例6-3-2I/O處理的模型 阻塞I/O模型:在這種模型下,若所調(diào)用的I/O函數(shù)沒有完成相關(guān)的功能,則會使進程掛起,直到相關(guān)數(shù)據(jù)到達才會返回。如常見對管道設(shè)備、終端設(shè)備和網(wǎng)絡(luò)設(shè)備進行讀寫時經(jīng)常會出現(xiàn)這種情

6、況。 非阻塞模型:在這種模型下,當(dāng)請求的I/O操作不能完成時,則不讓進程睡眠,而且立即返回。非阻塞I/O使用戶可以調(diào)用不會阻塞的I/O操作,如open()、write()和read()。如果該操作不能完成,則會立即返回出錯(例如:打不開文件)或者返回0(例如:在緩沖區(qū)中沒有數(shù)據(jù)可以讀取或者沒空間可以寫入數(shù)據(jù))。 I/O多路轉(zhuǎn)接模型:在這種模型下,如果請求的I/O操作阻塞,且它不是真正阻塞I/O,而是讓其中的一個函數(shù)等待,在這期間,I/O還能進行其他操作。如本節(jié)要介紹的select()和poll函數(shù)(),就是屬于這種模型。 信號驅(qū)動I/O模型:在這種模型下,通過安裝一個信號處理程序,系統(tǒng)可以自動

7、捕獲特定信號的到來,從而啟動I/O。這是由內(nèi)核通知用戶何時可以啟動一個I/O操作決定的。 異步I/O模型:在這種模型下,當(dāng)一個描述符已準(zhǔn)備好,可以啟動I/O時,進程會通知內(nèi)核?,F(xiàn)在,并不是所有的系統(tǒng)都支持這種模型。select()和poll()select()和poll()的I/O多路轉(zhuǎn)接模型是處理I/O復(fù)用的一個高效的方法。它可以具體設(shè)置程序中每一個所關(guān)心的文件描述符的條件、希望等待的時間等,從select()和poll()函數(shù)返回時,內(nèi)核會通知用戶已準(zhǔn)備好的文件描述符的數(shù)量、已準(zhǔn)備好的條件等。通過使用select()和poll()函數(shù)的返回結(jié)果,就可以調(diào)用相應(yīng)的I/O處理函數(shù)了。 sele

8、ct()函數(shù)格式(1)select()函數(shù)格式(2)一般來說,在使用select()函數(shù)之前,首先使用FD_ZERO()和FD_SET()來初始化文件描述符集,在使用了select()函數(shù)時,可循環(huán)使用FD_ISSET()來測試描述符集,在執(zhí)行完對相關(guān)文件描述符的操作之后,使用FD_CLR()來清除描述符集。 poll()函數(shù)格式示例閱讀代碼并運行示例6-3-3-1(select)和6-3-3-2(poll)13.3 嵌入式Linux串口應(yīng)用編程 串口概述 常見的數(shù)據(jù)通信的基本方式可分為并行通信與串行通信兩種。 并行通信是指利用多條數(shù)據(jù)傳輸線將一個字?jǐn)?shù)據(jù)的各比特位同時傳送。它的特點是傳輸速度快

9、,適用于傳輸距離短且傳輸速度較高的通信。 串行通信是指利用一條傳輸線將數(shù)據(jù)以比特位為單位順序傳送。特點是通信線路簡單,利用簡單的線纜就可實現(xiàn)通信,降低成本,適用于傳輸距離長且傳輸速度較慢的通信。串口是計算機一種常用的接口,常用的串口有RS-232-C接口。它是于1970年由美國電子工業(yè)協(xié)會(EIA)聯(lián)合貝爾系統(tǒng)、調(diào)制解調(diào)器廠家及計算機終端生產(chǎn)廠家共同制定的用于串行通訊的標(biāo)準(zhǔn),它的全稱是“數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通訊設(shè)備(DCE)之間串行二進制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)”。該標(biāo)準(zhǔn)規(guī)定采用一個DB25芯引腳的連接器或9芯引腳的連接器 串口設(shè)置- termios結(jié)構(gòu) struct termios un

10、signed short c_iflag; /* 輸入模式標(biāo)志 */ unsigned short c_oflag; /* 輸出模式標(biāo)志 */ unsigned short c_cflag; /* 控制模式標(biāo)志*/ unsigned short c_lflag; /* 本地模式標(biāo)志 */ unsigned char c_line; /* 線路規(guī)程 */ unsigned char c_ccNCC; /* 控制特性 */ speed_t c_ispeed; /* 輸入速度 */ speed_t c_ospeed; /* 輸出速度 */;ltermios是在POSIX規(guī)范中定義的標(biāo)準(zhǔn)接口,表示終端

11、設(shè)備(包括虛擬終端、串口等)。因為串口是一種終端設(shè)備,所以通過終端編程接口對其進行配置和控制。l終端有三種工作模式,分別為規(guī)范模式(canonical mode)、非規(guī)范模式(non-canonical mode)和原始模式(raw mode)。l通過在termios結(jié)構(gòu)的c_lflag中設(shè)置ICANNON標(biāo)志來定義終端是以規(guī)范模式(設(shè)置ICANNON標(biāo)志)還是以非規(guī)范模式(清除ICANNON標(biāo)志)工作,默認(rèn)情況為規(guī)范模式。終端模式(1)- 規(guī)范模式在規(guī)范模式下,所有的輸入是基于行進行處理。在用戶輸入一個行結(jié)束符(回車符、EOF等)之前,系統(tǒng)調(diào)用read()函數(shù)讀不到用戶輸入的任何字符。除了E

12、OF之外的行結(jié)束符(回車符等)與普通字符一樣會被read()函數(shù)讀取到緩沖區(qū)之中。在規(guī)范模式中,行編輯是可行的,而且一次調(diào)用read()函數(shù)最多只能讀取一行數(shù)據(jù)。如果在read()函數(shù)中被請求讀取的數(shù)據(jù)字節(jié)數(shù)小于當(dāng)前行可讀取的字節(jié)數(shù),則read()函數(shù)只會讀取被請求的字節(jié)數(shù),剩下的字節(jié)下次再被讀取。 終端模式(2)- 非規(guī)范模式在非規(guī)范模式下,所有的輸入是即時有效的,不需要用戶另外輸入行結(jié)束符,而且不可進行行編輯。在非規(guī)范模式下,對參數(shù)MIN(c_ccVMIN)和TIME(c_ccVTIME)的設(shè)置決定read()函數(shù)的調(diào)用方式。設(shè)置可以有4種不同的情況。MIN = 0和TIME = 0:re

13、ad()函數(shù)立即返回。若有可讀數(shù)據(jù),則讀取數(shù)據(jù)并返回被讀取的字節(jié)數(shù),否則讀取失敗并返回0。MIN 0和TIME = 0:read()函數(shù)會被阻塞直到MIN個字節(jié)數(shù)據(jù)可被讀取。MIN = 0和TIME 0:只要有數(shù)據(jù)可讀或者經(jīng)過TIME個十分之一秒的時間,read()函數(shù)則立即返回,返回值為被讀取的字節(jié)數(shù)。如果超時并且未讀到數(shù)據(jù),則read()函數(shù)返回0。MIN 0和TIME 0:當(dāng)有MIN個字節(jié)可讀或者兩個輸入字符之間的時間間隔超過TIME個十分之一秒時,read()函數(shù)才返回。因為在輸入第一個字符之后系統(tǒng)才會啟動定時器,所以在這種情況下,read()函數(shù)至少讀取一個字節(jié)之后才返回。 終端模式

14、(3)- 原始模式按照嚴(yán)格意義來講原始模式是一種特殊的非規(guī)范模式。在原始模式下,所有的輸入數(shù)據(jù)以字節(jié)為單位被處理。在這個模式下,終端是不可回顯的,而且所有特定的終端輸入/輸出控制處理不可用。通過調(diào)用cfmakeraw()函數(shù)可以將終端設(shè)置為原始模式,而且該函數(shù)通過以下代碼可以得到實現(xiàn)。termios_p-c_iflag &= (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);termios_p-c_oflag &= OPOST;termios_p-c_lflag &= (ECHO | E

15、CHONL | ICANON | ISIG | IEXTEN);termios_p-c_cflag &= (CSIZE | PARENB);termios_p-c_cflag |= CS8;設(shè)置串口屬性的基本流程 (1)保存原先串口配置 首先,為了安全起見和以后調(diào)試程序方便,可以先保存原先串口的配置,在這里可以使用函數(shù)tcgetattr(fd, &old_cfg)。該函數(shù)得到fd指向的終端的配置參數(shù),并將它們保存于termios結(jié)構(gòu)變量old_cfg中。該函數(shù)還可以測試配置是否正確、該串口是否可用等。若調(diào)用成功,函數(shù)返回值為0,若調(diào)用失敗,函數(shù)返回值為1 if (tcgetat

16、tr(fd, &old_cfg) != 0) perror(tcgetattr);return -1;設(shè)置串口屬性的基本流程 (2)激活選項 CLOCAL和CREAD分別用于本地連接和接受使能,因此,首先要通過位掩碼的方式激活這兩個選項。 調(diào)用cfmakeraw()函數(shù)可以將終端設(shè)置為原始模式,在后面的實例中,采用原始模式進行串口數(shù)據(jù)通信。 newtio.c_cflag |= CLOCAL | CREAD;cfmakeraw(&new_cfg);設(shè)置串口屬性的基本流程 (3)設(shè)置波特率設(shè)置波特率有專門的函數(shù),用戶不能直接通過位掩碼來操作。設(shè)置波特率的主要函數(shù)有:cfsetisp

17、eed()和cfsetospeed()。 設(shè)置字符大小 與設(shè)置波特率不同,設(shè)置字符大小并沒有現(xiàn)成可用的函數(shù),需要用位掩碼。一般首先去除數(shù)據(jù)位中的位掩碼,再重新按要求設(shè)置。 cfsetispeed(&new_cfg, B115200); cfsetospeed(&new_cfg, B115200);new_cfg.c_cflag &= CSIZE; /* 用數(shù)據(jù)位掩碼清空數(shù)據(jù)位設(shè)置 */new_cfg.c_cflag |= CS8;設(shè)置串口屬性的基本流程 (4)設(shè)置奇偶校驗位 設(shè)置奇偶校驗位需要用到termios中的兩個成員:c_cflag和c_iflag。首先要激活c_

18、cflag中的校驗位使能標(biāo)志PARENB和是否要進行偶校驗,同時還要激活c_iflag中的對于輸入數(shù)據(jù)的奇偶校驗使能(INPCK)。 偶校驗奇校驗new_cfg.c_cflag |= (PARODD | PARENB); new_cfg.c_iflag |= INPCK;new_cfg.c_cflag |= PARENB;new_cfg.c_cflag &= PARODD; /* 清除奇校驗標(biāo)志,則配置為偶校驗*/new_cfg.c_iflag |= INPCK;設(shè)置串口屬性的基本流程 (5)設(shè)置停止位 設(shè)置停止位是通過激活c_cflag中的CSTOPB而實現(xiàn)的。若停止位為一個,則清除

19、CSTOPB,若停止位為兩個,則激活CSTOPB。以下分別是停止位為一個和兩個時的代碼:new_cfg.c_cflag &= CSTOPB;/* 將停止位設(shè)置為一個比特 */new_cfg.c_cflag |= CSTOPB;/* 將停止位設(shè)置為兩個比特 */設(shè)置最少字符和等待時間 在對接收字符和等待時間沒有特別要求的情況下,可以將其設(shè)置為0,則在任何情況下read()函數(shù)立即返回 new_cfg.c_ccVTIME = 0;new_cfg.c_ccVMIN = 0;設(shè)置串口屬性的基本流程 (6)清除串口緩沖 由于串口在重新設(shè)置之后,需要對當(dāng)前的串口設(shè)備進行適當(dāng)?shù)奶幚?,這時就可調(diào)用在中

20、聲明的tcdrain()、tcflow()、tcflush()等函數(shù)來處理目前串口緩沖中的數(shù)據(jù) int tcdrain(int fd); /* 使程序阻塞,直到輸出緩沖區(qū)的數(shù)據(jù)全部發(fā)送完畢*/int tcflow(int fd, int action) ; /* 用于暫?;蛑匦麻_始輸出 */int tcflush(int fd, int queue_selector); /* 用于清空輸入/輸出緩沖區(qū)*/設(shè)置串口屬性的基本流程 (7)在本實例中使用tcflush()函數(shù),對于在緩沖區(qū)中的尚未傳輸?shù)臄?shù)據(jù),或者收到的但是尚未讀取的數(shù)據(jù),其處理方法取決于queue_selector的值,它可能的取值

21、有以下幾種。 TCIFLUSH:對接收到而未被讀取的數(shù)據(jù)進行清空處理。 TCOFLUSH:對尚未傳送成功的輸出數(shù)據(jù)進行清空處理。 TCIOFLUSH:包括前兩種功能,即對尚未處理的輸入輸出數(shù)據(jù)進行清空處理。 tcflush(fd, TCIFLUSH);設(shè)置串口屬性的基本流程 (8)激活配置 在完成全部串口配置之后,要激活剛才的配置并使配置生效。這里用到的函數(shù)是tcsetattr() 。tcsetattr(int fd, int optional_actions, const struct termios *termios_p);其中參數(shù)termios_p是termios類型的新配置變量。參數(shù)o

22、ptional_actions可能的取值有以下三種: TCSANOW:配置的修改立即生效。 TCSADRAIN:配置的修改在所有寫入fd的輸出都傳輸完畢之后生效。 TCSAFLUSH:所有已接受但未讀入的輸入都將在修改生效之前被丟棄。該函數(shù)若調(diào)用成功則返回0,若失敗則返回1 if (tcsetattr(fd, TCSANOW, &new_cfg) != 0)perror(tcsetattr);return -1;串口使用 (1)打開串口 打開串口和打開普通文件一樣,使用open()函數(shù)。 fd = open( /dev/ttyS0, O_RDWR | O_NOCTTY | O_NDEL

23、AY); O_NOCTTY標(biāo)志用于通知Linux系統(tǒng),該參數(shù)不會使打開的文件成為這個進程的控制終端。如果沒有指定這個標(biāo)志,那么任何一個輸入(諸如鍵盤中止信號等)都將會影響用戶的進程。 O_NDELAY標(biāo)志通知Linux系統(tǒng),這個程序不關(guān)心DCD信號線所處的狀態(tài)(端口的另一端是否激活或者停止)。如果用戶指定了這個標(biāo)志,則進程將會一直處在睡眠狀態(tài),直到DCD信號線被激活。串口使用 (2)讀寫串口 讀寫串口操作和讀寫普通文件一樣,使用read()和write()函數(shù) :write(fd, buff, strlen(buff);read(fd, buff, BUFFER_SIZE);接下來可恢復(fù)串口的

24、狀態(tài)為阻塞狀態(tài),用于等待串口數(shù)據(jù)的讀入 :接著可以測試打開文件描述符是否連接到一個終端設(shè)備,以進一步確認(rèn)串口是否正確打開 :fcntl(fd, F_SETFL, 0);isatty(STDIN_FILENO);示例閱讀代碼并運行示例6-4-3 在宿主機上運行寫串口的程序,而在目標(biāo)板上運行讀串口的程序 :/* 宿主機 ,寫串口*/$ ./com_writer Input some words(enter quit to exit):hello, Reader!Input some words(enter quit to exit):Im Writer!Input some words(enter

25、 quit to exit):This is a serial port testing program.Input some words(enter quit to exit):quit/* 目標(biāo)板 ,讀串口*/$ ./com_reader The received words are : hello, Reader!The received words are : Im Writer!The received words are : This is a serial port testing program.The received words are : quit13.4 標(biāo)準(zhǔn)I/O編程

26、 標(biāo)準(zhǔn)I/O編程概述前面講述的系統(tǒng)調(diào)用是操作系統(tǒng)直接提供的函數(shù)接口。因為運行系統(tǒng)調(diào)用時,Linux必須從用戶態(tài)切換到內(nèi)核態(tài),執(zhí)行相應(yīng)的請求,然后再返回到用戶態(tài),所以應(yīng)該盡量減少系統(tǒng)調(diào)用的次數(shù),從而提高程序的效率。標(biāo)準(zhǔn)I/O提供流緩沖的目的是盡可能減少使用read()和write()等系統(tǒng)調(diào)用的數(shù)量。標(biāo)準(zhǔn)I/O提供了3種類型的緩沖存儲。 全緩沖:在這種情況下,當(dāng)填滿標(biāo)準(zhǔn)I/O緩存后才進行實際I/O操作。對于存放在磁盤上的文件通常是由標(biāo)準(zhǔn)I/O庫實施全緩沖的。 行緩沖:在這種情況下,當(dāng)在輸入和輸出中遇到行結(jié)束符時,標(biāo)準(zhǔn)I/O庫執(zhí)行I/O操作。這允許我們一次輸出一個字符(如fputc()函數(shù)),但只

27、有寫了一行之后才進行實際I/O操作。標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出就是使用行緩沖的典型例子。 不帶緩沖:標(biāo)準(zhǔn)I/O庫不對字符進行緩沖。如果用標(biāo)準(zhǔn)I/O函數(shù)寫若干字符到不帶緩沖的流中,則相當(dāng)于用系統(tǒng)調(diào)用write()函數(shù)將這些字符全寫到被打開的文件上。標(biāo)準(zhǔn)出錯stderr通常是不帶緩存的,這就使得出錯信息可以盡快顯示出來,而不管它們是否含有一個行結(jié)束符。 基本操作 (1)打開文件: 有三個標(biāo)準(zhǔn)函數(shù),分別為:fopen()、fdopen()和freopen()。它們可以以不同的模式打開,但都返回一個指向FILE的指針,該指針指向?qū)?yīng)的I/O流。此后,對文件的讀寫都是通過這個FILE指針來進行。其中fopen(

28、)可以指定打開文件的路徑和模式,fdopen()可以指定打開的文件描述符和模式,而freopen()除可指定打開的文件、模式外,還可指定特定的I/O流?;静僮?(2)其中,mode定義打開文件的訪問權(quán)限等: 基本操作 (3)關(guān)閉文件: 關(guān)閉標(biāo)準(zhǔn)流文件的函數(shù)為fclose(),該函數(shù)將緩沖區(qū)內(nèi)的數(shù)據(jù)全部寫入到文件中,并釋放系統(tǒng)所提供的文件資源。基本操作 (4)在文件流被打開之后,可對文件流進行讀寫等操作,其中讀操作的函數(shù)為fread() :基本操作 (5)fwrite()函數(shù)是用于對指定的文件流進行寫操作。示例閱讀代碼并運行示例6-5-1其他操作(1) 字符輸入函數(shù) 字符輸出函數(shù) 其他操作(2

29、)行輸入函數(shù)行輸出函數(shù)其它操作(3)-格式化輸入輸出(1)其它操作(4)-格式化輸入輸出(2)學(xué)習(xí)目標(biāo)u掌握文件描述符的概念 u掌握Linux下文件相關(guān)的不帶緩存I/O函數(shù)的使用 u 掌握Linux下設(shè)備文件讀寫方法 u掌握Linux中對串口的操作 u熟悉Linux中標(biāo)準(zhǔn)文件I/O函數(shù)的使用 13.5 實驗 實驗1 -文件讀寫及上鎖(1) 1實驗?zāi)康耐ㄟ^編寫文件讀寫及上鎖的程序,進一步熟悉Linux中文件I/O相關(guān)的應(yīng)用開發(fā),并且熟練掌握open()、read()、write()、fcntl()等函數(shù)的使用。2實驗內(nèi)容l在Linux中FIFO是一種進程之間的管道通信機制。Linux支持完整的FIFO通信機制。l我們通過使用文件操作,仿真FIFO(先進先出)結(jié)構(gòu)以及生產(chǎn)者-消費者運行模型。l本實驗

溫馨提示

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

最新文檔

評論

0/150

提交評論