版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(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 實(shí)驗(yàn) 13.1 Linux中文件及文件描述符概述文件描述符內(nèi)核如何區(qū)分和引用特定的文件呢?這里用到了一個(gè)重要的概念文件描述符。對(duì)于Linux而言,所有對(duì)設(shè)備和文件的操作都是使用文件描述符來進(jìn)行的。文件描述符是一個(gè)非負(fù)的整數(shù),它是一個(gè)索引值,并指向在內(nèi)核中每個(gè)進(jìn)程打開文件的記錄表。當(dāng)打開一個(gè)現(xiàn)存文件或創(chuàng)建一個(gè)新文件時(shí),內(nèi)核就向進(jìn)程返回一個(gè)文件描述符;當(dāng)需要讀寫文件時(shí),也需要把文件描述符作為參數(shù)傳遞給相應(yīng)的函數(shù)。
2、通常,一個(gè)進(jìn)程啟動(dòng)時(shí),都會(huì)打開3個(gè)文件:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)出錯(cuò)處理。這3個(gè)文件分別對(duì)應(yīng)文件描述符為0、1和2(也就是宏替換STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO)。 13.2 底層文件I/O操作 函數(shù)說明 open()函數(shù)是用于打開或創(chuàng)建文件,在打開或創(chuàng)建文件時(shí)可以指定文件的屬性及用戶的權(quán)限等各種參數(shù)。close()函數(shù)是用于關(guān)閉一個(gè)被打開的文件。當(dāng)一個(gè)進(jìn)程終止時(shí),所有被它打開的文件都由內(nèi)核自動(dòng)關(guān)閉,很多程序都使用這一功能而不顯示地關(guān)閉一個(gè)文件。read()函數(shù)是用于將從指定的文件描述符中讀出的數(shù)據(jù)放到緩存區(qū)中,并返回實(shí)際讀入的字節(jié)數(shù)。若返回0,
3、則表示沒有數(shù)據(jù)可讀,即已達(dá)到文件尾。讀操作從文件的當(dāng)前指針位置開始。當(dāng)從終端設(shè)備文件中讀出數(shù)據(jù)時(shí),通常一次最多讀一行。write()函數(shù)是用于向打開的文件寫數(shù)據(jù),寫操作從文件的當(dāng)前指針位置開始。對(duì)磁盤文件進(jìn)行寫操作,若磁盤已滿或超出該文件的長度,則write()函數(shù)返回失敗。lseek()函數(shù)是用于在指定的文件描述符中將文件指針定位到相應(yīng)的位置。它只能用在可定位(可隨機(jī)訪問)文件操作中。管道、套接字和大部分字符設(shè)備文件是不可定位的,所以在這些文件的操作中無法使用lseek()調(diào)用。 函數(shù)格式(1)函數(shù)格式(2)函數(shù)格式(3)示例閱讀代碼并運(yùn)行示例6-3-1文件鎖 文件鎖包括建議性鎖和強(qiáng)制性鎖。
4、建議性鎖要求每個(gè)上鎖文件的進(jìn)程都要檢查是否有鎖存在,并且尊重已有的鎖。在一般情況下,內(nèi)核和系統(tǒng)都不使用建議性鎖。強(qiáng)制性鎖是由內(nèi)核執(zhí)行的鎖,當(dāng)一個(gè)文件被上鎖進(jìn)行寫入操作的時(shí)候,內(nèi)核將阻止其他任何文件對(duì)其進(jìn)行讀寫操作。采用強(qiáng)制性鎖對(duì)性能的影響很大,每次讀寫操作都必須檢查是否有鎖存在。在Linux中,實(shí)現(xiàn)文件上鎖的函數(shù)有l(wèi)ockf()和fcntl(),其中l(wèi)ockf()用于對(duì)文件施加建議性鎖,而fcntl()不僅可以施加建議性鎖,還可以施加強(qiáng)制鎖。同時(shí),fcntl()還能對(duì)文件的某一記錄上鎖,也就是記錄鎖。記錄鎖又可分為讀取鎖和寫入鎖,其中讀取鎖又稱為共享鎖,它能夠使多個(gè)進(jìn)程都能在文件的同一部分建立
5、讀取鎖。而寫入鎖又稱為排斥鎖,在任何時(shí)刻只能有一個(gè)進(jìn)程在文件的某個(gè)部分上建立寫入鎖。當(dāng)然,在文件的同一部分不能同時(shí)建立讀取鎖和寫入鎖。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;示例閱讀代碼并運(yùn)行示例6-3-2I/O處理的模型 阻塞I/O模型:在這種模型下,若所調(diào)用的I/O函數(shù)沒有完成相關(guān)的功能,則會(huì)使進(jìn)程掛起,直到相關(guān)數(shù)據(jù)到達(dá)才會(huì)返回。如常見對(duì)管道設(shè)備、終端設(shè)備和網(wǎng)絡(luò)設(shè)備進(jìn)行讀寫時(shí)經(jīng)常會(huì)出現(xiàn)這種情
6、況。 非阻塞模型:在這種模型下,當(dāng)請(qǐng)求的I/O操作不能完成時(shí),則不讓進(jìn)程睡眠,而且立即返回。非阻塞I/O使用戶可以調(diào)用不會(huì)阻塞的I/O操作,如open()、write()和read()。如果該操作不能完成,則會(huì)立即返回出錯(cuò)(例如:打不開文件)或者返回0(例如:在緩沖區(qū)中沒有數(shù)據(jù)可以讀取或者沒空間可以寫入數(shù)據(jù))。 I/O多路轉(zhuǎn)接模型:在這種模型下,如果請(qǐng)求的I/O操作阻塞,且它不是真正阻塞I/O,而是讓其中的一個(gè)函數(shù)等待,在這期間,I/O還能進(jìn)行其他操作。如本節(jié)要介紹的select()和poll函數(shù)(),就是屬于這種模型。 信號(hào)驅(qū)動(dòng)I/O模型:在這種模型下,通過安裝一個(gè)信號(hào)處理程序,系統(tǒng)可以自動(dòng)
7、捕獲特定信號(hào)的到來,從而啟動(dòng)I/O。這是由內(nèi)核通知用戶何時(shí)可以啟動(dòng)一個(gè)I/O操作決定的。 異步I/O模型:在這種模型下,當(dāng)一個(gè)描述符已準(zhǔn)備好,可以啟動(dòng)I/O時(shí),進(jìn)程會(huì)通知內(nèi)核?,F(xiàn)在,并不是所有的系統(tǒng)都支持這種模型。select()和poll()select()和poll()的I/O多路轉(zhuǎn)接模型是處理I/O復(fù)用的一個(gè)高效的方法。它可以具體設(shè)置程序中每一個(gè)所關(guān)心的文件描述符的條件、希望等待的時(shí)間等,從select()和poll()函數(shù)返回時(shí),內(nèi)核會(huì)通知用戶已準(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ù)時(shí),可循環(huán)使用FD_ISSET()來測(cè)試描述符集,在執(zhí)行完對(duì)相關(guān)文件描述符的操作之后,使用FD_CLR()來清除描述符集。 poll()函數(shù)格式示例閱讀代碼并運(yùn)行示例6-3-3-1(select)和6-3-3-2(poll)13.3 嵌入式Linux串口應(yīng)用編程 串口概述 常見的數(shù)據(jù)通信的基本方式可分為并行通信與串行通信兩種。 并行通信是指利用多條數(shù)據(jù)傳輸線將一個(gè)字?jǐn)?shù)據(jù)的各比特位同時(shí)傳送。它的特點(diǎn)是傳輸速度快
9、,適用于傳輸距離短且傳輸速度較高的通信。 串行通信是指利用一條傳輸線將數(shù)據(jù)以比特位為單位順序傳送。特點(diǎn)是通信線路簡單,利用簡單的線纜就可實(shí)現(xiàn)通信,降低成本,適用于傳輸距離長且傳輸速度較慢的通信。串口是計(jì)算機(jī)一種常用的接口,常用的串口有RS-232-C接口。它是于1970年由美國電子工業(yè)協(xié)會(huì)(EIA)聯(lián)合貝爾系統(tǒng)、調(diào)制解調(diào)器廠家及計(jì)算機(jī)終端生產(chǎn)廠家共同制定的用于串行通訊的標(biāo)準(zhǔn),它的全稱是“數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通訊設(shè)備(DCE)之間串行二進(jìn)制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)”。該標(biāo)準(zhǔn)規(guī)定采用一個(gè)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è)備(包括虛擬終端、串口等)。因?yàn)榇谑且环N終端設(shè)備,所以通過終端編程接口對(duì)其進(jìn)行配置和控制。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ī)范模式下,所有的輸入是基于行進(jìn)行處理。在用戶輸入一個(gè)行結(jié)束符(回車符、EOF等)之前,系統(tǒng)調(diào)用read()函數(shù)讀不到用戶輸入的任何字符。除了E
12、OF之外的行結(jié)束符(回車符等)與普通字符一樣會(huì)被read()函數(shù)讀取到緩沖區(qū)之中。在規(guī)范模式中,行編輯是可行的,而且一次調(diào)用read()函數(shù)最多只能讀取一行數(shù)據(jù)。如果在read()函數(shù)中被請(qǐng)求讀取的數(shù)據(jù)字節(jié)數(shù)小于當(dāng)前行可讀取的字節(jié)數(shù),則read()函數(shù)只會(huì)讀取被請(qǐng)求的字節(jié)數(shù),剩下的字節(jié)下次再被讀取。 終端模式(2)- 非規(guī)范模式在非規(guī)范模式下,所有的輸入是即時(shí)有效的,不需要用戶另外輸入行結(jié)束符,而且不可進(jìn)行行編輯。在非規(guī)范模式下,對(duì)參數(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ù)會(huì)被阻塞直到MIN個(gè)字節(jié)數(shù)據(jù)可被讀取。MIN = 0和TIME 0:只要有數(shù)據(jù)可讀或者經(jīng)過TIME個(gè)十分之一秒的時(shí)間,read()函數(shù)則立即返回,返回值為被讀取的字節(jié)數(shù)。如果超時(shí)并且未讀到數(shù)據(jù),則read()函數(shù)返回0。MIN 0和TIME 0:當(dāng)有MIN個(gè)字節(jié)可讀或者兩個(gè)輸入字符之間的時(shí)間間隔超過TIME個(gè)十分之一秒時(shí),read()函數(shù)才返回。因?yàn)樵谳斎氲谝粋€(gè)字符之后系統(tǒng)才會(huì)啟動(dòng)定時(shí)器,所以在這種情況下,read()函數(shù)至少讀取一個(gè)字節(jié)之后才返回。 終端模式
14、(3)- 原始模式按照嚴(yán)格意義來講原始模式是一種特殊的非規(guī)范模式。在原始模式下,所有的輸入數(shù)據(jù)以字節(jié)為單位被處理。在這個(gè)模式下,終端是不可回顯的,而且所有特定的終端輸入/輸出控制處理不可用。通過調(diào)用cfmakeraw()函數(shù)可以將終端設(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ù)還可以測(cè)試配置是否正確、該串口是否可用等。若調(diào)用成功,函數(shù)返回值為0,若調(diào)用失敗,函數(shù)返回值為1 if (tcgetat
16、tr(fd, &old_cfg) != 0) perror(tcgetattr);return -1;設(shè)置串口屬性的基本流程 (2)激活選項(xiàng) CLOCAL和CREAD分別用于本地連接和接受使能,因此,首先要通過位掩碼的方式激活這兩個(gè)選項(xiàng)。 調(diào)用cfmakeraw()函數(shù)可以將終端設(shè)置為原始模式,在后面的實(shí)例中,采用原始模式進(jìn)行串口數(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è)置奇偶校驗(yàn)位 設(shè)置奇偶校驗(yàn)位需要用到termios中的兩個(gè)成員:c_cflag和c_iflag。首先要激活c_
18、cflag中的校驗(yàn)位使能標(biāo)志PARENB和是否要進(jìn)行偶校驗(yàn),同時(shí)還要激活c_iflag中的對(duì)于輸入數(shù)據(jù)的奇偶校驗(yàn)使能(INPCK)。 偶校驗(yàn)奇校驗(yàn)new_cfg.c_cflag |= (PARODD | PARENB); new_cfg.c_iflag |= INPCK;new_cfg.c_cflag |= PARENB;new_cfg.c_cflag &= PARODD; /* 清除奇校驗(yàn)標(biāo)志,則配置為偶校驗(yàn)*/new_cfg.c_iflag |= INPCK;設(shè)置串口屬性的基本流程 (5)設(shè)置停止位 設(shè)置停止位是通過激活c_cflag中的CSTOPB而實(shí)現(xiàn)的。若停止位為一個(gè),則清除
19、CSTOPB,若停止位為兩個(gè),則激活CSTOPB。以下分別是停止位為一個(gè)和兩個(gè)時(shí)的代碼:new_cfg.c_cflag &= CSTOPB;/* 將停止位設(shè)置為一個(gè)比特 */new_cfg.c_cflag |= CSTOPB;/* 將停止位設(shè)置為兩個(gè)比特 */設(shè)置最少字符和等待時(shí)間 在對(duì)接收字符和等待時(shí)間沒有特別要求的情況下,可以將其設(shè)置為0,則在任何情況下read()函數(shù)立即返回 new_cfg.c_ccVTIME = 0;new_cfg.c_ccVMIN = 0;設(shè)置串口屬性的基本流程 (6)清除串口緩沖 由于串口在重新設(shè)置之后,需要對(duì)當(dāng)前的串口設(shè)備進(jìn)行適當(dāng)?shù)奶幚恚@時(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)在本實(shí)例中使用tcflush()函數(shù),對(duì)于在緩沖區(qū)中的尚未傳輸?shù)臄?shù)據(jù),或者收到的但是尚未讀取的數(shù)據(jù),其處理方法取決于queue_selector的值,它可能的取值
21、有以下幾種。 TCIFLUSH:對(duì)接收到而未被讀取的數(shù)據(jù)進(jìn)行清空處理。 TCOFLUSH:對(duì)尚未傳送成功的輸出數(shù)據(jù)進(jìn)行清空處理。 TCIOFLUSH:包括前兩種功能,即對(duì)尚未處理的輸入輸出數(shù)據(jù)進(jìn)行清空處理。 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ù)不會(huì)使打開的文件成為這個(gè)進(jìn)程的控制終端。如果沒有指定這個(gè)標(biāo)志,那么任何一個(gè)輸入(諸如鍵盤中止信號(hào)等)都將會(huì)影響用戶的進(jìn)程。 O_NDELAY標(biāo)志通知Linux系統(tǒng),這個(gè)程序不關(guān)心DCD信號(hào)線所處的狀態(tài)(端口的另一端是否激活或者停止)。如果用戶指定了這個(gè)標(biāo)志,則進(jìn)程將會(huì)一直處在睡眠狀態(tài),直到DCD信號(hào)線被激活。串口使用 (2)讀寫串口 讀寫串口操作和讀寫普通文件一樣,使用read()和write()函數(shù) :write(fd, buff, strlen(buff);read(fd, buff, BUFFER_SIZE);接下來可恢復(fù)串口的
24、狀態(tài)為阻塞狀態(tài),用于等待串口數(shù)據(jù)的讀入 :接著可以測(cè)試打開文件描述符是否連接到一個(gè)終端設(shè)備,以進(jìn)一步確認(rèn)串口是否正確打開 :fcntl(fd, F_SETFL, 0);isatty(STDIN_FILENO);示例閱讀代碼并運(yùn)行示例6-4-3 在宿主機(jī)上運(yùn)行寫串口的程序,而在目標(biāo)板上運(yùn)行讀串口的程序 :/* 宿主機(jī) ,寫串口*/$ ./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ù)接口。因?yàn)檫\(yùn)行系統(tǒng)調(diào)用時(shí),Linux必須從用戶態(tài)切換到內(nèi)核態(tài),執(zhí)行相應(yīng)的請(qǐ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種類型的緩沖存儲(chǔ)。 全緩沖:在這種情況下,當(dāng)填滿標(biāo)準(zhǔn)I/O緩存后才進(jìn)行實(shí)際I/O操作。對(duì)于存放在磁盤上的文件通常是由標(biāo)準(zhǔn)I/O庫實(shí)施全緩沖的。 行緩沖:在這種情況下,當(dāng)在輸入和輸出中遇到行結(jié)束符時(shí),標(biāo)準(zhǔn)I/O庫執(zhí)行I/O操作。這允許我們一次輸出一個(gè)字符(如fputc()函數(shù)),但只
27、有寫了一行之后才進(jìn)行實(shí)際I/O操作。標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出就是使用行緩沖的典型例子。 不帶緩沖:標(biāo)準(zhǔn)I/O庫不對(duì)字符進(jìn)行緩沖。如果用標(biāo)準(zhǔn)I/O函數(shù)寫若干字符到不帶緩沖的流中,則相當(dāng)于用系統(tǒng)調(diào)用write()函數(shù)將這些字符全寫到被打開的文件上。標(biāo)準(zhǔn)出錯(cuò)stderr通常是不帶緩存的,這就使得出錯(cuò)信息可以盡快顯示出來,而不管它們是否含有一個(gè)行結(jié)束符。 基本操作 (1)打開文件: 有三個(gè)標(biāo)準(zhǔn)函數(shù),分別為:fopen()、fdopen()和freopen()。它們可以以不同的模式打開,但都返回一個(gè)指向FILE的指針,該指針指向?qū)?yīng)的I/O流。此后,對(duì)文件的讀寫都是通過這個(gè)FILE指針來進(jìn)行。其中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)在文件流被打開之后,可對(duì)文件流進(jìn)行讀寫等操作,其中讀操作的函數(shù)為fread() :基本操作 (5)fwrite()函數(shù)是用于對(duì)指定的文件流進(jìn)行寫操作。示例閱讀代碼并運(yùn)行示例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中對(duì)串口的操作 u熟悉Linux中標(biāo)準(zhǔn)文件I/O函數(shù)的使用 13.5 實(shí)驗(yàn) 實(shí)驗(yàn)1 -文件讀寫及上鎖(1) 1實(shí)驗(yàn)?zāi)康耐ㄟ^編寫文件讀寫及上鎖的程序,進(jìn)一步熟悉Linux中文件I/O相關(guān)的應(yīng)用開發(fā),并且熟練掌握open()、read()、write()、fcntl()等函數(shù)的使用。2實(shí)驗(yàn)內(nèi)容l在Linux中FIFO是一種進(jìn)程之間的管道通信機(jī)制。Linux支持完整的FIFO通信機(jī)制。l我們通過使用文件操作,仿真FIFO(先進(jìn)先出)結(jié)構(gòu)以及生產(chǎn)者-消費(fèi)者運(yùn)行模型。l本實(shí)驗(yàn)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度美容院員工社會(huì)保險(xiǎn)繳納合同樣本4篇
- 課題申報(bào)參考:面向2035年高等教育布局結(jié)構(gòu)研究
- 民政局2025年離婚協(xié)議書起草與備案流程指導(dǎo)4篇
- 2025年度門頭房屋租賃合同含租賃用途及經(jīng)營方向限制4篇
- 河南省周口中英文學(xué)校高三上學(xué)期期中考試語文試題(含答案)
- 2025年度個(gè)人二手房交易反擔(dān)保合同規(guī)范2篇
- 2025年度個(gè)人汽車貨運(yùn)風(fēng)險(xiǎn)分擔(dān)合同范本
- 2025年度門禁監(jiān)控設(shè)備生產(chǎn)與銷售合同8篇
- 2025年度水電工程合同履約監(jiān)管承包協(xié)議4篇
- 2025年度木結(jié)構(gòu)建筑綠色施工與環(huán)保驗(yàn)收合同4篇
- 人口老齡化背景下居民養(yǎng)老金融資產(chǎn)配置影響因素研究
- 人教版初中英語單詞大全七八九年級(jí)(帶音標(biāo)) mp3聽力音頻下載
- 2024項(xiàng)目部安全管理人員安全培訓(xùn)考試題及參考答案(模擬題)
- 《習(xí)近平法治思想概論(第二版)》 課件 2. 第二章 習(xí)近平法治思想的理論意義
- 諾和關(guān)懷俱樂部對(duì)外介紹
- 玩轉(zhuǎn)數(shù)和形課件
- 保定市縣級(jí)地圖PPT可編輯矢量行政區(qū)劃(河北省)
- 新蘇教版科學(xué)六年級(jí)下冊(cè)全冊(cè)教案(含反思)
- 天然飲用山泉水項(xiàng)目投資規(guī)劃建設(shè)方案
- 供方注冊(cè)指南-ZTE
- 2019年重慶市中考物理試卷(a卷)及答案
評(píng)論
0/150
提交評(píng)論