版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Linux系統(tǒng)調(diào)用和文件I/OLinux系統(tǒng)調(diào)用與文件I/OLinux系統(tǒng)調(diào)用所謂系統(tǒng)調(diào)用是指操作系統(tǒng)提供應(yīng)用戶程序的一組“特殊〞接口,用戶程序可以經(jīng)過這組“特殊〞接口來獲得操作系統(tǒng)內(nèi)核提供的特殊效力。在Linux中用戶程序不能直接訪問內(nèi)核提供的效力。為了更好的維護(hù)內(nèi)核空間,將程序的運轉(zhuǎn)空間分為內(nèi)核空間和用戶空間,他們運轉(zhuǎn)在不同的級別上,在邏輯上是相互隔離的。用戶程序接口〔API〕在Linux中用戶編程接口〔API〕遵照了在UNIX中最流行的運用編程界面規(guī)范—POSIX規(guī)范。這些系統(tǒng)調(diào)用編程接口主要經(jīng)過C庫〔libc〕實現(xiàn)的。內(nèi)核空間用戶空間系統(tǒng)調(diào)用用戶程序接口API系統(tǒng)命令系統(tǒng)調(diào)用、API與系統(tǒng)命令之間的關(guān)系文件I/O引見可用的文件I/O函數(shù)——翻開文件、讀文件、寫文件等等。大多數(shù)Linux文件I/O只需用到5個函數(shù):open、read、write、lseek以及close。不帶緩存指的是每個read和write都調(diào)用內(nèi)核中的一個系統(tǒng)調(diào)用。這些不帶緩存的I/O函數(shù)不是ANSIC的組成部分,而是POSIX組成部分。文件描畫符對于內(nèi)核而言,一切翻開文件都由文件描畫符援用。文件描畫符是一個非負(fù)整數(shù)。當(dāng)翻開一個現(xiàn)存文件或創(chuàng)建一個新文件時,內(nèi)核向進(jìn)程前往一個文件描畫符。當(dāng)讀、寫一個文件時,用open或creat前往的文件描畫符標(biāo)識該文件,將其作為參數(shù)傳送給read或write。文件描畫符在POSIX.1運用程序中,整數(shù)0、1、2應(yīng)被代換成符號常數(shù):STDIN_FILENOSTDOUT_FILENOSTDERR_FILENO這些常數(shù)都定義在頭文件<unistd.h>中。文件描畫符的范圍是0~OPEN_MAX。早期的UNIX版本采用的上限值是19(允許每個進(jìn)程翻開20個文件),如今很多系統(tǒng)那么將其添加至256。open函數(shù)#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>intopen(constchar*pathname,intoflag, …/*,mode_tmode*/);功能:翻開文件前往:假設(shè)勝利為文件描畫符,假設(shè)出錯為-1open函數(shù)pathname是要翻開或創(chuàng)建的文件的名字。oflag參數(shù)可用來闡明此函數(shù)的多個選擇項。對于open函數(shù)而言,僅當(dāng)創(chuàng)建新文件時才運用第三個參數(shù)。用以下一個或多個常數(shù)進(jìn)展或運算構(gòu)成oflag參數(shù)(這些常數(shù)定義在<fcntl.h>頭文件中):O_RDONLY只讀翻開。O_WRONLY只寫翻開。O_RDWR讀、寫翻開。O_APPEND每次寫時都加到文件的尾端。O_CREAT假設(shè)此文件不存在那么創(chuàng)建它。運用此選擇項時,需同時闡明第三個參數(shù)mode,用其闡明該新文件的存取答應(yīng)權(quán)位。O_EXCL假好像時指定了O_CREAT,而文件曾經(jīng)存在,那么出錯。這可測試一個文件能否存在,假設(shè)不存在那么創(chuàng)建此文件成為一個原子操作。O_TRUNC假設(shè)此文件存在,而且為只讀或只寫勝利翻開,那么將其長度截短為0。O_NOCTTY假設(shè)pathname指的是終端設(shè)備,那么不將此設(shè)備分配作為此進(jìn)程的控制終端。O_NONBLOCK假設(shè)pathname指的是一個FIFO、一個塊特殊文件或一個字符特殊文件,那么此選擇項為此文件的本次翻開操作和后續(xù)的I/O操作設(shè)置非阻塞方式。O_SYNC使每次write都等到物理I/O操作完成。creat函數(shù)#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>intcreat(constchar*pathname,mode_tmode);功能:創(chuàng)建一個新的文件。前往:假設(shè)勝利為只寫翻開的文件描畫符,假設(shè)出錯為-1。留意,此函數(shù)等效于:open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode);creat的一個缺乏之處是它以只寫方式翻開所創(chuàng)建的文件。close函數(shù)#include<unistd.h>intclose(intfiledes);功能:封鎖一個翻開文件前往:假設(shè)勝利為0,假設(shè)出錯為-1 當(dāng)一個進(jìn)程終止時,它一切的翻開文件都由內(nèi)核自動封鎖。很多程序都運用這一功能而不顯式地用close封鎖翻開的文件。lseek函數(shù)每個翻開文件都有一個與其相關(guān)聯(lián)的“當(dāng)前文件偏移量〞。它是一個非負(fù)整數(shù),用以度量從文件開場處計算的字節(jié)數(shù)。通常,讀、寫操作都從當(dāng)前文件偏移量處開場,并使偏移量添加所讀或?qū)懙淖止?jié)數(shù)。按系統(tǒng)默許,當(dāng)翻開一個文件時,除非指定O_APPEND選擇項,否那么該位移量被設(shè)置為0??梢哉{(diào)用lseek顯式地定位一個翻開文件。lseek函數(shù)#include<sys/types.h>#include<unistd.h>off_tlseek(intfilesdes,off_toffset,intwhence);功能:設(shè)置文件內(nèi)容讀寫位置前往:假設(shè)勝利為新的文件位移,假設(shè)出錯為-1。對參數(shù)offset的解釋與參數(shù)whence的值有關(guān)。假設(shè)whence是SEEK_SET,那么將該文件的位移量設(shè)置為距文件開場處offset個字節(jié)。假設(shè)whence是SEEK_CUR,那么將該文件的位移量設(shè)置為其當(dāng)前值加offset,offset可為正或負(fù)。假設(shè)whence是SEEK_END,那么將該文件的位移量設(shè)置為文件長度加offset,offset可為正或負(fù)。read函數(shù)#include<unistd.h>ssize_tread(intfd,void*buf,size_tcount);功能:從翻開文件中讀數(shù)據(jù)前往:讀到的字節(jié)數(shù),假設(shè)已到文件尾為0,假設(shè)出錯為-1。read函數(shù)有多種情況可使實踐讀到的字節(jié)數(shù)少于要求讀字節(jié)數(shù):讀普通文件時,在讀到要求字節(jié)數(shù)之前已到達(dá)了文件尾端。例如,假設(shè)在到達(dá)文件尾端之前還有30個字節(jié),而要求讀100個字節(jié),那么read前往30,下一次再調(diào)用read時,它將前往0(文件尾端)。當(dāng)從終端設(shè)備讀時,通常以行為單位,讀到換行符就前往。當(dāng)從網(wǎng)絡(luò)讀時,網(wǎng)絡(luò)中的緩沖機(jī)構(gòu)能夠呵斥前往值小于所要求讀的字節(jié)數(shù)。某些面向記錄的設(shè)備,例如磁帶,一次最多前往一個記錄。讀操作從文件的當(dāng)前位移量處開場,在勝利前往之前,該位移量添加實踐讀得的字節(jié)數(shù)。write函數(shù)#include<unistd.h>ssize_twrite(intfd,constvoid*buf,size_tcount);功能;向翻開文件寫數(shù)據(jù)。前往:假設(shè)勝利為已寫的字節(jié)數(shù),假設(shè)出錯為-1。其前往值通常與參數(shù)count的值不同,否那么表示出錯。write出錯的一個常見緣由是:磁盤已寫滿,或者超越了對一個給定進(jìn)程的文件長度限制。對于普通文件,寫操作從文件的當(dāng)前位移量處開場。假設(shè)在翻開該文件時,指定了O_APPEND選擇項,那么在每次寫操作之前,將文件位移量設(shè)置在文件的當(dāng)前結(jié)尾處。在一次勝利寫之后,該文件位移量添加實踐寫的字節(jié)數(shù)。fcntl函數(shù)#include<unistd.h>#include<fcntl.h>intfcntl(intfiledes,intcmd,...);功能:改動曾經(jīng)翻開文件的性質(zhì)前往:假設(shè)勝利那么依賴于cmd(),假設(shè)出錯為-1。fcntl函數(shù)fcntl函數(shù)有五種功能:復(fù)制一個現(xiàn)存的描畫符,新文件描畫符作為函數(shù)值返(cmd=F_DUPFD〕。獲得/設(shè)置文件描畫符標(biāo)志,對應(yīng)于filedes的文件描畫符標(biāo)志作為函數(shù)值前往.〔cmd=F_GETFD或F_SETFD〕。獲得/設(shè)置文件形狀標(biāo)志,對應(yīng)于filedes的文件形狀標(biāo)志作為函數(shù)值前往?!瞔md=F_GETFL或F_SETFL〕。獲得/設(shè)置異步I/O〔cmd=F_GETOWN或F_SETOWN〕。獲得/設(shè)置記錄鎖〔cmd=F_SETLK,F_SETLKW〕。O_RDONLY只讀打開O_WRONLY只寫打開O_RDWR讀/寫打開O_APPEND寫時都添加至文件尾O_NONBLOCK非阻塞方式O_SYNC等待寫完成O_ASYNC異步I/O文件形狀標(biāo)志闡明ioctl函數(shù)ioctl函數(shù)是I/O操作的雜物箱。不能用本章中其他函數(shù)表示的I/O操作通常都能用ioctl表示。終端I/O是ioctl的最大運用方面,主要用于設(shè)備的I/O控制。#include<sys/ioctl.h>intioctl(intfiledes,intrequest,...);前往:假設(shè)出錯那么為-1,假設(shè)勝利那么為其他值。ioctl函數(shù)例如:串口線上傳送的數(shù)據(jù)經(jīng)過read、write來操作,而串口的波特率、校驗位、停頓位可以經(jīng)過ioctl來設(shè)置。規(guī)范文件I/O操作fopen函數(shù)#include<stdio.h>FILE*fopen(constchar*path,constchar*mode)函數(shù)功能:翻開一個文件前往值:文件順利翻開后,指向該流的文件指針就會被前往。假設(shè)文件翻開失敗那么前往NULL,并把錯誤代碼存在error中。參數(shù)闡明path字符串包含欲翻開的文件途徑及文件名,參數(shù)mode字符串那么代表著流形狀。Mode有以下幾種形狀字符串:r翻開只讀文件,該文件必需存在r+翻開可讀寫的文件,該文件必需存在w翻開只寫文件,假設(shè)文件存在那么文件長度清為0,即該文件內(nèi)容會消逝。假設(shè)文件不存在那么建立該文件。w+翻開可讀寫文件,假設(shè)文件存在那么文件長度清為0,即該文件內(nèi)容會消逝。假設(shè)文件不存在那么建立該文件。a以附加的方式翻開只寫文件。假設(shè)文件不存在那么建立,存在那么把數(shù)據(jù)添加在文件末尾a+以附加的方式翻開讀寫文件,同a。fclose函數(shù)#include<stdio.h>Intfclose(FILE*stream)功能:封鎖一個流。留意:運用fclose函數(shù)就可以把緩沖區(qū)內(nèi)最后剩下的數(shù)據(jù)輸出到磁盤文件中,并釋放文件指針和有關(guān)的緩沖區(qū)。fputc函數(shù)#include<stdio.h>intfputc(intch,FILE*stream);功能:送一個字符到一個流中。fgetc函數(shù)#include<stdio.h>intfgetc(FILE*stream);功能:fgetc()從參數(shù)stream所指的文件中讀取一個字符。假設(shè)讀到文件尾而無數(shù)據(jù)時便前往EOFfseek函數(shù)include<stdio.h>intfseek(FILE*stream,longoffset,intfromwhere);類似lseek();ftelllongftell(FILE*stream);fgets函數(shù)#inlcude<stdio.h>Char*fgets(char*s,intsize,FILE*stream);函數(shù)闡明:函數(shù)fgets用來從參數(shù)stream所指的文件內(nèi)讀入字符并存入到參數(shù)s所指的內(nèi)存空間,直到出現(xiàn)換行符、讀到文件尾或是已讀了size-1個字符為止,最后會加上NULL作為字符串終了。前往值:勝利前往s指針,錯誤前往NULLfputs函數(shù)fprintf函數(shù)#include<stdio.h>intfprintf(FILE*stream,constchar*format,…);功能:fprintf()函數(shù)根據(jù)指定的format〔格式〕〔格式〕發(fā)送信息〔參數(shù)〕到由stream〔流〕指定的文件。fprintf()只能和printf()一樣任務(wù)。Fprintf()的前往值是輸出的字符數(shù),發(fā)送錯誤時前往一個負(fù)值。fscanf函數(shù)#include<stdio.h>Intfscanf(FILE*stream,char*format,…);功能:從一個流中執(zhí)行格式化輸入fread函數(shù)#include<stdio.h>Intfread(void*ptr,intsize,intnitems,FILE*stream);功能:從一個流中讀數(shù)據(jù)參數(shù):用于接受數(shù)據(jù)的地址〔指針〕〔ptr〕單個元素的大小〔size〕:單位是字節(jié)而不是位,例如:讀取一個整數(shù)值就是4元素個數(shù)〔nitems〕提供數(shù)據(jù)的文件指針〔stream〕前往值:勝利讀取的元素個數(shù)fwrite函數(shù)#include<stdio.h>Intfwrite(constvo
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度酒店客房清潔服務(wù)協(xié)議3篇
- 2025年消防技術(shù)服務(wù)與總承包一體化合同
- 引進(jìn)國際藝術(shù)團(tuán)隊2025年度合作合同2篇
- 二零二五版環(huán)保設(shè)備居間轉(zhuǎn)讓授權(quán)合同3篇
- 二零二五版汽車維修配件居間服務(wù)合同A2篇
- 二零二五版小學(xué)教師勞動權(quán)益保障與勞動仲裁合同2篇
- 2025年企業(yè)股權(quán)轉(zhuǎn)讓合同解除協(xié)議
- 2025年電影制片人職業(yè)責(zé)任保險協(xié)議
- 2025年物業(yè)智慧停車服務(wù)協(xié)議范本3篇
- 2025年度煤矸石運輸環(huán)保責(zé)任協(xié)議4篇
- 畢淑敏心理咨詢手記在線閱讀
- 亞硝酸鈉安全標(biāo)簽
- pcs-985ts-x說明書國內(nèi)中文版
- GB 11887-2012首飾貴金屬純度的規(guī)定及命名方法
- 小品《天宮賀歲》臺詞劇本手稿
- 醫(yī)院患者傷口換藥操作課件
- 欠薪強(qiáng)制執(zhí)行申請書
- 礦山年中期開采重點規(guī)劃
- 資源庫建設(shè)項目技術(shù)規(guī)范匯編0716印刷版
- GC2級壓力管道安裝質(zhì)量保證體系文件編寫提綱
- 預(yù)應(yīng)力混凝土簡支小箱梁大作業(yè)計算書
評論
0/150
提交評論