2 回答

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊
open系統(tǒng)調(diào)用
open函數(shù)的三個(gè)參數(shù):
(1)path是已經(jīng)存在的文件的路徑;
(2)oflags參數(shù):若值為 O_RDONLY ,就以只讀方式打開(kāi)文件;
若值為 O_WDONLY,就以只寫方式打開(kāi)文件;
若值為 O_RDWR,就以讀寫方式打開(kāi)文件;
(3)參數(shù)mode:文件的權(quán)限,對(duì)于一個(gè)已經(jīng)存在的文件,參數(shù)mode是沒(méi)有用的,通常將其省略,因此這種情況下open調(diào)用只需兩個(gè)參數(shù)。
創(chuàng)建新文件:
前面已經(jīng)說(shuō)到,當(dāng)文件不存在時(shí),open會(huì)創(chuàng)建一個(gè)新文件(僅能是普通文件),我們只需要用 or操作向open的 oflags參數(shù)中加入標(biāo)志O_CREAT即可。這樣可以創(chuàng)建一個(gè)新的只讀文件,但是這沒(méi)有任何意義,因?yàn)樗鶆?chuàng)建的新文件沒(méi)有任何可讀內(nèi)容。因此一般需要 O_CREAT與 O_WRONLY或 O_RDWR一起使用,此時(shí)就需要mode參數(shù)了。
例如:
int fd = open("/home/LY/newfile",O_RDWR | O_CREAT,MODE_FILE)
參數(shù)mode僅在創(chuàng)建新文件時(shí)有效,對(duì)于一個(gè)已經(jīng)存在的文件,它沒(méi)有任何作用。
關(guān)于open的flags參數(shù):
除了以上介紹的 open標(biāo)志外,open還有許多標(biāo)志,具體的如下表所示:
標(biāo)志
解釋
O_RDONLY
只讀方式打開(kāi)
O_WRONLY
只寫方式打開(kāi)
O_RDWR
讀寫方式打開(kāi)
O_APPEND
每次寫都追加到文件的尾端
O_CREAT
若文件不存在則創(chuàng)建文件
O_DSYNC
設(shè)置同步I/O方式
O_EXCL
如果文件已存在,則出錯(cuò);必須與O_CREAT一起使用
O_NOCTTY
不將此設(shè)備作為控制終端
O_NONBLOCK
不等待命名管道或特殊文件準(zhǔn)備好
O_RSYNC
設(shè)置同步I/O方式
O_SYNC
設(shè)置同步I/O方式
O_TRUNC
將其長(zhǎng)度截短為0
write系統(tǒng)調(diào)用
write函數(shù)的三個(gè)參數(shù):
(1)fildes: 文件描述符
(2)buf:指定寫入數(shù)據(jù)的數(shù)據(jù)緩沖區(qū)
(3)nbytes:指定寫入的字節(jié)數(shù)
函數(shù)返回值:
成功:已寫的字節(jié)數(shù)
-1 :出錯(cuò)
0:未寫入任何數(shù)據(jù)
例子:
運(yùn)行結(jié)果:
read系統(tǒng)調(diào)用
read函數(shù)的三個(gè)參數(shù):
(1)fildes:文件描述符
(2)buf:指定讀入數(shù)據(jù)的數(shù)據(jù)緩沖區(qū)
(3)nbytes:指定讀入的字節(jié)數(shù)
函數(shù)返回值:
成功:已讀的字節(jié)數(shù)
0:未讀入任何數(shù)據(jù)
-1:出錯(cuò)
例子:
運(yùn)行結(jié)果:
close系統(tǒng)調(diào)用
通過(guò)對(duì) close進(jìn)行分析,我們會(huì)發(fā)現(xiàn)close并沒(méi)有做什么實(shí)質(zhì)工作,它沒(méi)有刷新任何內(nèi)核緩沖區(qū),而僅僅是使文件描述符可以重用。

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊
n=read(i,butter,MAX);while(n>0){ write(j,butter,n);}close(i);close(j);
如果我說(shuō)的沒(méi)有錯(cuò)的話, 文件大于butter的話是不可能一次讀寫完成的; 原因是你在循環(huán)中沒(méi)有重復(fù)讀寫;
n=read(i,butter,MAX);while(n>0){ write(j,butter,n);n=read(i,butter,MAX);}close(i);close(j);
這樣就可以讀完了; 當(dāng)然,這種程序通??磩e人代碼都是這樣寫的:
while(read(i,butter,MAX)>0){ write(j,butter,n);}close(i);close(j);
添加回答
舉報(bào)