2 回答

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

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