linux高級(jí)編程-開發(fā)文件_第1頁(yè)
linux高級(jí)編程-開發(fā)文件_第2頁(yè)
linux高級(jí)編程-開發(fā)文件_第3頁(yè)
linux高級(jí)編程-開發(fā)文件_第4頁(yè)
linux高級(jí)編程-開發(fā)文件_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

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

的.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)用編程接口主要通過(guò)C庫(kù)(libc)實(shí)現(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個(gè)函數(shù):open、read、wri seek 以及close。不帶緩存指的是每個(gè)read和write都調(diào)用內(nèi)核中的一個(gè)系統(tǒng)調(diào)用。這些不帶緩存的I/O函數(shù)不是ANSI

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

文件描述符?

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

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

9(允許每個(gè)進(jìn)程打開2

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

open返回:若成功為文件描述符,若出錯(cuò)為-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ù)可用來(lái)說(shuō)明此函數(shù)的多個(gè)選擇項(xiàng)。mode對(duì)于open函數(shù)而言,僅當(dāng)創(chuàng)建新文件時(shí)才使用第三個(gè)參數(shù)。(文件權(quán)限 od

777

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

open函數(shù)O_APPEND

每次寫時(shí)都加到文件的尾端。O_CREAT

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

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

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

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

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

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

參數(shù)

mode

說(shuō)明:mode標(biāo)志用來(lái)表示文件的

權(quán)限.Linux總共用5個(gè)數(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)建一個(gè)新文件。返回:若成功為只寫打開的文件描述符,若出錯(cuò)為-

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

(pathname,

O_WRONLY

|O_CREAT

|

O_TRUNC,

mode)

;creat的一個(gè)不足之處是它以只寫方式打開所創(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)閉一個(gè)打開文件:返回:若成功為0,若出錯(cuò)為-

1當(dāng)一個(gè)進(jìn)程終止時(shí),它所有的打開文件都由內(nèi)核自動(dòng)關(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,若出錯(cuò)為-1。如read成功,則返回讀到的字節(jié)數(shù)。如已到達(dá)文件的尾端,則返回0。#include

<unistd.h>ssize_t

read(int

feledes,

void

*buff,

size_t

nbytes)

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

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

文件尾端)

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

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

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

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

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

<unistd.h>ssize_t

write(int

filedes,

const

void

*

buff,size_t

nbytes)

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

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

1。對(duì)參數(shù)offset

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

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

,則將該文件的位移量設(shè)置為文件長(zhǎng)度加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í)行,則返回新的文件位移量,為此可以用下列方式確定一個(gè)打開文件的當(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論