嵌入式系統(tǒng)設(shè)計與開發(fā)教程 課件 第3章 Linux系統(tǒng)編程基礎(chǔ)-3_第1頁
嵌入式系統(tǒng)設(shè)計與開發(fā)教程 課件 第3章 Linux系統(tǒng)編程基礎(chǔ)-3_第2頁
嵌入式系統(tǒng)設(shè)計與開發(fā)教程 課件 第3章 Linux系統(tǒng)編程基礎(chǔ)-3_第3頁
嵌入式系統(tǒng)設(shè)計與開發(fā)教程 課件 第3章 Linux系統(tǒng)編程基礎(chǔ)-3_第4頁
嵌入式系統(tǒng)設(shè)計與開發(fā)教程 課件 第3章 Linux系統(tǒng)編程基礎(chǔ)-3_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Linux應(yīng)用程序設(shè)計-

文件操作編程

Linux平臺下文件編程在Linux平臺下對文件編程可以使用兩類函數(shù)1、C語言I/O庫函數(shù)fopen(…),fread(…),fwrite(…),fclose()等

2、Linux操作系統(tǒng)文件APIopen(…),read(…),write(…),close()等前者是C語言提供的函數(shù)庫,與操作系統(tǒng)是獨立的。后者實際上是依賴于Linux系統(tǒng)調(diào)用。系統(tǒng)調(diào)用:操作系統(tǒng)提供給用戶程序調(diào)用的一組“特殊”接口,用戶程序可以通過這組“特殊”接口來獲得操作系統(tǒng)內(nèi)核提供的服務(wù)。系統(tǒng)命令(如ls,cd,cp等)實際上是一個可執(zhí)行程序,它的內(nèi)部調(diào)用了用戶編程接口(API)來實現(xiàn)相應(yīng)的功能。【例】#

cp

/floppy/TEST

/tmp/test——cp命令調(diào)用了用戶編程接口(API)open()、write()與read()API函數(shù)說明

create()函數(shù)用于創(chuàng)建文件。open()函數(shù)是用于打開或創(chuàng)建文件,在打開或創(chuàng)建文件時可以指定文件的屬性及用戶的權(quán)限等各種參數(shù)。close()函數(shù)是用于關(guān)閉一個被打開的文件。read()函數(shù)是用于將從指定的文件描述符中讀出的數(shù)據(jù)放到緩存區(qū)中,并返回實際讀入的字節(jié)數(shù)。若返回0,則表示沒有數(shù)據(jù)可讀,即已達到文件尾。讀操作從文件的當(dāng)前指針位置開始。write()函數(shù)是用于向打開的文件寫數(shù)據(jù),寫操作從文件的當(dāng)前指針位置開始。對磁盤文件進行寫操作,若磁盤已滿或超出該文件的長度,則write()函數(shù)返回失敗。lseek()函數(shù)是用于在指定的文件描述符中將文件指針定位到相應(yīng)的位置。它只能用在可定位(可隨機訪問)文件操作中。

關(guān)于文件操作的用戶編程接口(API)可以處理任何文件,包括硬件設(shè)備文件,這是和linux操作系統(tǒng)相關(guān)的接口調(diào)用。應(yīng)用程序訪問驅(qū)動需要使用這些函數(shù)。使用文件API必須的頭文件#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdlib.h>Linux文件API-打開intopen(constchar*pathname,intflags);intopen(constchar*pathname,intflags,mode_tmode);open(“123.txt”,O_RDONLY);open(“/home/linux/test”,O_RDWR);包含頭文件:#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>其中pathname是要打開的文件名(包含路徑名稱,缺省是認為在當(dāng)前路徑下面)。flags表示打開文件的方式。flags可以是下面的一個值或者是幾個值的組合.O_RDONLY、O_WRONLY、O_RDWR只能使用任意的一個intopen(constchar*pathname,intflags);intopen(constchar*pathname,intflags,mode_tmode);open(“123.txt”,O_RDONLY);文件描述符對于Linux而言,一切即文件。所有對設(shè)備和文件的操作都是使用文件描述符來進行的。如果文件打開成功,open函數(shù)會返回一個文件描述符。intopen(constchar*pathname,intflags);intopen(constchar*pathname,intflags,mode_tmode);

文件描述符是一個非負的整數(shù),當(dāng)打開一個現(xiàn)存文件或創(chuàng)建一個新文件時,內(nèi)核就向進程返回一個文件描述符;當(dāng)需要讀寫文件時,也需要把文件描述符作為參數(shù)傳遞給相應(yīng)的函數(shù)。它是一個索引值,并指向在內(nèi)核中每個進程打開文件的記錄表。#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<stdio.h>main(){

intfd=0;

//打開文件

fd=open(“hello.txt”,O_RDWR);

if(fd<=0){printf(“sorry,openfailed!\n”);}else{

printf(“openok!\n”);

close(fd);

}return;}使用O_CREAT創(chuàng)建文件

使用O_CREAT標志,表示如果文件不存在則創(chuàng)建文件,可以指定mode標志,用來表示文件的訪問權(quán)限。

以O(shè)_CREAT為標志的open實際上實現(xiàn)了文件創(chuàng)建的功能。例如:

open("test.txt",O_RDWR|O_CREAT,0640);open("test",O_CREAT,S_IRWXU|S_IROTH|S_IXOTH|S_ISUID);intopen(constchar*pathname,intflags);intopen(constchar*pathname,intflags,mode_tmode);mode可以是以下情況的組合,可以通過上述宏進行“或”邏輯產(chǎn)生標志。

標志含義S_IRUSR

用戶可以讀

S_IWUSR

用戶可以寫

S_IXUSR

用戶可以執(zhí)行

S_IRWXU

用戶可以讀、寫、執(zhí)行

S_IRGRP

組可以讀

S_IWGRP組可以寫S_IXGRP組可以執(zhí)行S_IRWXG組可以讀寫執(zhí)行intopen(constchar*pathname,intflags,mode_tmode);標志含義S_IROTH其他人可以讀S_IWOTH其他人可以寫S_IXOTH其他人可以執(zhí)行S_IRWXO其他人可讀、寫、執(zhí)行S_ISUID設(shè)置用戶執(zhí)行IDS_ISGID設(shè)置組的執(zhí)行IDfd=open("test",O_CREAT,S_IRWXU|S_IROTH);#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<stdio.h>main(){

intfd;

//打開文件

fd=open("hello.txt",O_CREAT|O_RDWR,S_IRWXU|S_IRGRP|S_IROTH);if(fd<0){printf("openhello.txterror!\n");}else{close(fd);}return;}Linux總共用5個數(shù)字來表示文件的各種權(quán)限:(八進制)第一位表示設(shè)置用戶ID;第二位表示設(shè)置組ID;第三位表示用戶自己的權(quán)限位;第四位表示組的權(quán)限;最后一位表示其他人的權(quán)限。每個數(shù)字可以取1(執(zhí)行權(quán)限)、2(寫權(quán)限)、4(讀權(quán)限)、0(無)或者是這些值的和。mode用數(shù)字表示intopen(constchar*pathname,intflags,mode_tmode);

fd=open(“test”,O_CREAT,0640);Linux文件API-關(guān)閉當(dāng)操作完成以后,要關(guān)閉文件,只要調(diào)用close即可,其中fd是要關(guān)閉的文件描述符:包含頭文件:#include<unistd.h>intclose(intfd);Linux文件API-讀ssize_tread(intfd,

void*buf,size_tlength)從文件描述符fd所指定的文件中讀取length個字節(jié)到buf所指向的緩沖區(qū),返回值為實際讀取字節(jié)數(shù)。包含頭文件:#include<unistd.h>舉例:#include<unistd.h>。。。charbuff[1024]={0};fd=open(“hello.txt”,O_RDWR);length=read(fd,buff,1024);#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<string.h>main(){

intlen=0;charbuf[1024]={'0'};intfd=open("123.txt",O_RDWR);if(fd<0){printf("open123.txterror!\n");}else{len=read(fd,buf,10);close(fd);}printf("%s\n",buf);printf("len=%d\n",len);}練習(xí)一、2、file.txt文件存放一段有20個以上英文單詞句子,請把文件內(nèi)容讀出并顯示,同時統(tǒng)計單詞的個數(shù)。上傳代碼,以及程序運行結(jié)果的截圖。?1、將ppt上的程序輸入并調(diào)試,熟悉文件處理函數(shù)的使用。Linux文件API-寫ssize_twrite(intfd,constvoid*buf,size_tlength);把length個字節(jié)從buf指向的緩沖區(qū)中寫到文件描述符fd所指向的文件中,返回值為實際寫入的字節(jié)數(shù)。包含頭文件:#include<unistd.h>舉例:#include<unistd.h>。。。charbuff[1024]={“hello,Iamsohappytoday!\n”};fd=open(“hello.txt”,O_RDWR);length=write(fd,buff,strlen(buff));#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<string.h>main(){

intfd,len;

charstr[100]=“Hello,SoftwareWeekly”,

//創(chuàng)建并打開文件

fd

=open(“hello.txt”,O_CREAT|O_RDWR,S_IRUSR|S_IWUSR);

if(fd>0){

write(fd,str,strlen(str));/

close(fd);

}}#include<sys/types.h>//類型#include<sys/stat.h>//獲取文件屬性#include<fcntl.h>//文件描述詞操作#include<unistd.h>#include<stdio.h>

main(){

intfd,len;

charstr[100]=“Hello,SoftwareWeekly”;charnewstr[100];

fd=open(“hello.txt”,O_CREAT|O_RDWR,S_IRUSR|S_IWUSR)

if(fd>0){

write(fd,str,strlen(str));/

close(fd);

}

fd=open(“hello.txt”,O_RDWR);//以讀寫方式打開

len=read(fd,newstr,100);/*讀取文件內(nèi)容*/

newstr[len]='\0';

printf("%s\n",newstr);

close(fd);

}Linux文件API-定位對于隨機文件,我們可以隨機的指定位置讀寫lseek()將文件讀寫指針相對whence移動offset個字節(jié)。操作成功時,返回文件指針相對于文件頭的位置。包含頭文件:

#include<sys/types.h>#include<fcntl.h>參數(shù)whence可使用下述值:SEEK_SET:相對文件開頭SEEK_CUR:相對文件讀寫指針的當(dāng)前位置SEEK_END:相對文件末尾

off_tlseek(intfd,offset_toffset,intwhence);offset可取負值,例如下述調(diào)用可將文件指針相對當(dāng)前位置向前移動5個字節(jié):

lseek(fd,-5,SEEK_CUR);由于lseek函數(shù)的返回值為文件指針相對于文件頭的位置,因此下列調(diào)用的返回值就是文件的長度:

len=

lseek(fd,0,SEEK_END);

off_tlseek(intfd,offset_toffset,intwhence);#include<sys/types.h>//類型#include<sys/stat.h>//獲取文件屬性#include<fcntl.h>//文件描述詞操作#include<unistd.h>#include<stdio.h>

main(){

intfd,filelen,readlen;

charnewestr[100]={‘\0’};

fd=open(“hello.txt”,O_RDWR);//以讀寫方式打開

lseek(fd,6,SEEK_BEG);readlen=read(fd,newstr,100);/*讀取文件內(nèi)容*/

printf("%s\n",newstr);filelen=lseek(fd,0,SEEK_END);printf(“filelenghtis%d\n",filelen);

close(fd);

}#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<fcntl.h>#include<sys/stat.h>#include<time.h>#defineBUFFER_SIZE1024intmain(intargc,char*argv[]){//FILE*fileFrom,*fileTo;intfd_from,fd_to;

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論