linux高級編程-開發(fā)文件_第1頁
linux高級編程-開發(fā)文件_第2頁
linux高級編程-開發(fā)文件_第3頁
linux高級編程-開發(fā)文件_第4頁
linux高級編程-開發(fā)文件_第5頁
免費預(yù)覽已結(jié)束,剩余16頁可下載查看

下載本文檔

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

文檔簡介

Linux系統(tǒng)調(diào)用所謂系統(tǒng)調(diào)用是指操作系統(tǒng)提供給用戶程序的一組“特殊”接口,用戶程序可以通過這組“特殊”接口來獲得操作系統(tǒng)內(nèi)核提供的特殊服務(wù)。在linux中用戶程序不能直接

內(nèi)核提供的服務(wù)。為了更好的保護內(nèi)核空間,將程序的運行空間分為內(nèi)核空間和用戶空間,他們運行在不同的級別上,在邏輯上是相互

的.Linux系統(tǒng)調(diào)用與文件I/O軟帝信息科技http

在linux中用戶編程接口(API)遵循了在UNIX中最流行的應(yīng)用編程界面標(biāo)準(zhǔn)—POSIX標(biāo)準(zhǔn)。這些系統(tǒng)調(diào)用編程接口主要通過C庫(libc)實現(xiàn)的。內(nèi)核空間用戶空間系統(tǒng)調(diào)用用戶程序接口API系統(tǒng)命令圖1

系統(tǒng)調(diào)用、API與系統(tǒng)命令之間的關(guān)系用戶編程接口(API)軟帝信息科技http

可用的文件I/O函數(shù)——打開文件、讀文件、寫文件等等。大多數(shù)linux文件I/O只需用到5個函數(shù):open、read、wri seek 以及close。不帶緩存指的是每個read和write都調(diào)用內(nèi)核中的一個系統(tǒng)調(diào)用。這些不帶緩存的I/O函數(shù)不是ANSI

C的組成部分,但是POSIX組成部分。文件I/O介紹軟帝信息科技http

文件描述符?

對于內(nèi)核而言,所有打開文件都由文件描述符

。文件描述符是一個非負(fù)整數(shù)。當(dāng)打開一個現(xiàn)存文件或創(chuàng)建一個新文件時,內(nèi)核向進程返回一個文件描述符。當(dāng)讀、寫一個文件時,用open或creat返回的文件描述符標(biāo)識該文件,將其作為參數(shù)傳送給read或write。在POSIX.1應(yīng)用程序中,整數(shù)0、1、2應(yīng)被代換成符號常數(shù)STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。這些常數(shù)都定義在頭文件<unistd.h>中。文件描述符的范圍是0-OPEN_MAX。早期的UNIX版本采用的上限值是1

9(允許每個進程打開2

0個文件),現(xiàn)在很多系統(tǒng)則將其增加至63。軟帝信息科技http

open返回:若成功為文件描述符,若出錯為-1#include

<sys/types.h>#include

<sys/stat.h>#include

<fcntl.h>int

open(const

char

*pathname,

int

oflag,

mode_t

mode)

;open函數(shù)軟帝信息科技http

open函數(shù)pathname是要打開或創(chuàng)建的文件的名字。oflag參數(shù)可用來說明此函數(shù)的多個選擇項。mode對于open函數(shù)而言,僅當(dāng)創(chuàng)建新文件時才使用第三個參數(shù)。(文件權(quán)限 od

777

filename)參數(shù) oflag說明:用下列一個或多個常數(shù)進行或運算構(gòu)成oflag參數(shù)(這些常數(shù)定義在<fcntl.h>頭文件中):O_RDONLY只讀打開。O_WRONLY只寫打開。O_RDWR讀、寫打開。軟帝信息科技http

open函數(shù)O_APPEND

每次寫時都加到文件的尾端。O_CREAT

若此文件不存在則創(chuàng)建它。使用此選擇項時,需同時說明第三個參數(shù)mode,用其說明該新文件的存取

權(quán)位。O_EXCL如果同時指定了O_CREAT,而文件已經(jīng)存在,則出錯。這可測試一個文件是否存在,如果不存在則創(chuàng)建此文件成為一個原子操作。O_TRUNC

如果此文件存在,而且為只讀或只寫成功打開,則將其長度截短為0。O_NOCTTY

如果pathname指的是終端設(shè)備,則不將此設(shè)備分配作為此進程的控制終端。O_NONBLOCK

如果pathname指的是一個FIFO、一個塊特殊文件或一個字符特殊文件,則此選擇項為此文件的本次打開操作和后續(xù)的I/O操作設(shè)置非阻塞方式。O_SYNC

使每次write都等到物理I/O操作完成。軟帝信息科技http

參數(shù)

mode

說明:mode標(biāo)志用來表示文件的

權(quán)限.Linux總共用5個數(shù)字表示文件各種權(quán)限.

open(“test”,O_RDWR|O_CREAT,10705)open函數(shù)用戶ID設(shè)置組ID自己權(quán)限其他限組權(quán)限軟帝信息科技http

CREAT函數(shù)creat可用creat函數(shù)創(chuàng)建一個新文件。返回:若成功為只寫打開的文件描述符,若出錯為-

1。注意,此函數(shù)等效于:open

(pathname,

O_WRONLY

|O_CREAT

|

O_TRUNC,

mode)

;creat的一個不足之處是它以只寫方式打開所創(chuàng)建的文件。#include

<sys/types.h>#include

<sys/stat.h>#include

<fcntl.h>int

creat(const

char

*

pathname,

mode_t

m

o

d

e);軟帝信息科技http

close可用close函數(shù)關(guān)閉一個打開文件:返回:若成功為0,若出錯為-

1當(dāng)一個進程終止時,它所有的打開文件都由內(nèi)核自動關(guān)閉。很多程序都使用這

能而不顯式地用close關(guān)閉打開的文件。如

例http:///*open.c*/#include

<unistd.h>#include

<sys/types.h>#include

<sys/stat.h>#include

<fcntl.h>#include

<stdlib.h>科技#include

<stdio.h>#include

<unistd.h>int

close

(int

filedes);CLOSE函數(shù)12司帝信

公int

main(void)o.c",

O_CREAT

|

O_TRUNC

|

O_WRONLY,0600

))<0)o.c

%d\n",fd);o.c\n");{ int

fd;if((fd

=

open("/tmp/{perror("open:");exit(1);}elseprintf("open

file:if(

close(fd)

<

0

){perror("close:");exit(1);}elseprintf("Closeexit(0);}CLOSE函數(shù)http

用read函數(shù)從打開文件中讀數(shù)據(jù)返回:讀到的字節(jié)數(shù),若已到文件尾為0,若出錯為-1。如read成功,則返回讀到的字節(jié)數(shù)。如已到達文件的尾端,則返回0。#include

<unistd.h>ssize_t

read(int

feledes,

void

*buff,

size_t

nbytes)

;read函數(shù)軟帝信息科技http

有多種情況可使實際讀到的字節(jié)數(shù)少于要求讀字節(jié)數(shù):讀普通文件時,在讀到要求字節(jié)數(shù)之前已到達了文件尾端。例如,若在到達文件尾端之前還有30個字節(jié),而要求讀100個字節(jié),則read返回30,下一次再調(diào)用read時,它將返回0 (

文件尾端)

。當(dāng)從終端設(shè)備讀時,通常一次最多讀一行。當(dāng)從網(wǎng)絡(luò)讀時,網(wǎng)絡(luò)中的緩沖機構(gòu)可能造成返回值小于所要求讀的字節(jié)數(shù)。某些面向記錄的設(shè)備,例如磁帶,一次最多返回一個記錄。讀操作從文件的當(dāng)前位移量處開始,在成功返回之前,該位移量增加實際讀得的字節(jié)數(shù)。read函數(shù)軟帝信息科技http

write函數(shù)用write函數(shù)向打開文件寫數(shù)據(jù)。http

之后,該文件位移量增加實際寫的字節(jié)數(shù)。返回:若成功為已寫的字節(jié)數(shù),若出錯為-

1。其返回值通常與參數(shù)nbytes的值不同,否則表示出錯。w

rite出錯的一個常見原因是:磁盤已寫滿,或者超過了對一個給定進程的文件長度限制。對于普通文件,寫操作從文件的當(dāng)前位移量處開始。如果在打開該文件時,指定了O_APPEND選擇項,則在每次寫操作之前,將文件位移量設(shè)置在文件的當(dāng)前結(jié)尾處。在一軟次帝成信息功科寫技#include

<unistd.h>ssize_t

write(int

filedes,

const

void

*

buff,size_t

nbytes)

;每個打開文件都有一個與其相關(guān)聯(lián)的“當(dāng)前文件偏移量”。它是一個非負(fù)整數(shù),用以度量從文件開始處計算的字節(jié)數(shù)。通常,讀、寫操作都從當(dāng)前文件偏移量處開始,并使偏移量增加所讀或?qū)懙淖止?jié)數(shù)。按系統(tǒng)默認(rèn),當(dāng)打開一個文件時,除非指定O_APPEND選擇項,否則該位移量被設(shè)置為0。可以調(diào)用lseek顯式地定位一個打開文件。lseek函數(shù)軟帝信息科技http

返回:若成功為新的文件位移,若出錯為-

1。對參數(shù)offset

的解釋與參數(shù)whence的值有關(guān)。若whence是SEEK_SET,則將該文件的位移量設(shè)置為距文件開始處offset

個字節(jié)。若whence是SEEK_CUR,則將該文件的位移量設(shè)置為其當(dāng)前值加offset,offset可為正或負(fù)。若whence是SEEK_END

,則將該文件的位移量設(shè)置為文件長度加offset,offset可為正或負(fù)。lseek函數(shù)#include

<sys/types.h>#include

<unistd.h>off_t

lseek(int

filesdes,

off_t

offset,

int

whence)

;軟帝信息科技http

若lseek成功執(zhí)行,則返回新的文件位移量,為此可以用下列方式確定一個打開文件的當(dāng)前位移量:off_t

curr_pos;Curr_pos

=

lseek(fd,

0,

SEEK_CUR);lseek函數(shù)軟帝信息科技http

/*write.c*/#include

<unistd.h>#include

<sys/types.h>#include

<sys/stat.h>#include

<fcntl.h>#include

<stdlib.h>#include

<stdio.h>#include

<string.h>int

main(void){ int

i,fd,size,len;char

*buf=" o!

I'm

writing

to

this

file!";char

buf_r[10];len

=

strlen(buf);buf_r[10]

=

'\0';軟帝信息科技例子程序19http

i

f((

fd =

open("/tmp/

o.c",

O_CREAT

|

O_TRUNC

|

O_RDWR,0666

))<0){perror("open:");exit(1);}elseprintf("open

file:

o.

c

%d\n",fd);if((

size =

write(

fd,

buf,

len)) <

0){perror("write:");exit(1);}elseprintf("Write:%s\n",buf);軟帝信息科技例子程序20http

lseek(

溫馨提示

  • 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

提交評論