linux系统——fread()与read()函数族区别
fread與read區(qū)別:
1,fread是帶緩沖的,read不帶緩沖.
2,fopen是標(biāo)準(zhǔn)c里定義的,open是POSIX中定義的.
3,fread可以讀一個(gè)結(jié)構(gòu).read在linux/unix中讀二進(jìn)制與普通文件沒(méi)有區(qū)別.
4,fopen不能指定要?jiǎng)?chuàng)建文件的權(quán)限.open可以指定權(quán)限.
5,fopen返回指針,open返回文件描述符(整數(shù)).
6,linux/unix中任何設(shè)備都是文件,都可以用open,read.
如果文件的大小是8k。你如果用read/write,且只分配了2k的緩存,則要將此文件讀出需要做4次系統(tǒng)調(diào)用來(lái)實(shí)際從磁盤(pán)上讀出。如果你用fread/fwrite,則系統(tǒng)自動(dòng)分配緩存,則讀出此文件只要一次系統(tǒng)調(diào)用從磁盤(pán)上讀出。
也就是用read/write要讀4次磁盤(pán),而用fread/fwrite則只要讀1次磁盤(pán)。效率比read/write要高4倍。
如果程序?qū)?nèi)存有限制,則用read/write比較好。用fread 和fwrite,它自動(dòng)分配緩存,速度會(huì)很快,比自己來(lái)做要簡(jiǎn)單。如果要處理一些特殊的描述符,用read 和write,如套接口,管道之類(lèi)的
系統(tǒng)調(diào)用write的效率取決于你buf的大小和你要寫(xiě)入的總數(shù)量,如果buf太小,你進(jìn)入內(nèi)核空間的次數(shù)大增,效率就低下。而fwrite會(huì)替你做緩存,減少了實(shí)際出現(xiàn)的系統(tǒng)調(diào)用,所以效率比較高。
如果只調(diào)用一次(可能嗎?),這倆差不多,嚴(yán)格來(lái)說(shuō)write要快一點(diǎn)點(diǎn)(因?yàn)閷?shí)際上fwrite最后還是用了write做真正的寫(xiě)入文件系統(tǒng)工作),但是這其中的差別無(wú)所謂。
open(打開(kāi)文件)
相關(guān)函數(shù) read,write,fcntl,close,link,stat,umask,unlink,fopen
表頭文件
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
定義函數(shù)
int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);
函數(shù)說(shuō)明
參數(shù)pathname 指向欲打開(kāi)的文件路徑字符串。下列是參數(shù)flags 所能使用的旗標(biāo):
O_RDONLY 以只讀方式打開(kāi)文件
O_WRONLY 以只寫(xiě)方式打開(kāi)文件
O_RDWR 以可讀寫(xiě)方式打開(kāi)文件。上述三種旗標(biāo)是互斥的,也就是不可同時(shí)使用,但可與下列的旗標(biāo)利用OR(|)運(yùn)算符組合。
O_CREAT 若欲打開(kāi)的文件不存在則自動(dòng)建立該文件。
O_EXCL 如果O_CREAT 也被設(shè)置,此指令會(huì)去檢查文件是否存在。文件若不存在則建立該文件,否則將導(dǎo)致打開(kāi)文件錯(cuò)誤。此外,若O_CREAT與O_EXCL同時(shí)設(shè)置,并且欲打開(kāi)的文件為符號(hào)連接,則會(huì)打開(kāi)文件失敗。
O_NOCTTY 如果欲打開(kāi)的文件為終端機(jī)設(shè)備時(shí),則不會(huì)將該終端機(jī)當(dāng)成進(jìn)程控制終端機(jī)。
O_TRUNC 若文件存在并且以可寫(xiě)的方式打開(kāi)時(shí),此旗標(biāo)會(huì)令文件長(zhǎng)度清為0,而原來(lái)存于該文件的資料也會(huì)消失。
O_APPEND 當(dāng)讀寫(xiě)文件時(shí)會(huì)從文件尾開(kāi)始移動(dòng),也就是所寫(xiě)入的數(shù)據(jù)會(huì)以附加的方式加入到文件后面。
O_NONBLOCK 以不可阻斷的方式打開(kāi)文件,也就是無(wú)論有無(wú)數(shù)據(jù)讀取或等待,都會(huì)立即返回進(jìn)程之中。
O_NDELAY 同O_NONBLOCK。
O_SYNC 以同步的方式打開(kāi)文件。
O_NOFOLLOW 如果參數(shù)pathname 所指的文件為一符號(hào)連接,則會(huì)令打開(kāi)文件失敗。
O_DIRECTORY 如果參數(shù)pathname 所指的文件并非為一目錄,則會(huì)令打開(kāi)文件失敗。
此為L(zhǎng)inux2.2以后特有的旗標(biāo),以避免一些系統(tǒng)安全問(wèn)題。參數(shù)mode 則有下列數(shù)種組合,只有在建立新文件時(shí)才會(huì)生效,此外真正建文件時(shí)的權(quán)限會(huì)受到umask值所影響,因此該文件權(quán)限應(yīng)該為(mode-umaks)。
S_IRWXU00700 權(quán)限,代表該文件所有者具有可讀、可寫(xiě)及可執(zhí)行的權(quán)限。
S_IRUSR 或S_IREAD,00400權(quán)限,代表該文件所有者具有可讀取的權(quán)限。
S_IWUSR 或S_IWRITE,00200 權(quán)限,代表該文件所有者具有可寫(xiě)入的權(quán)限。
S_IXUSR 或S_IEXEC,00100 權(quán)限,代表該文件所有者具有可執(zhí)行的權(quán)限。
S_IRWXG 00070權(quán)限,代表該文件用戶(hù)組具有可讀、可寫(xiě)及可執(zhí)行的權(quán)限。
S_IRGRP 00040 權(quán)限,代表該文件用戶(hù)組具有可讀的權(quán)限。
S_IWGRP 00020權(quán)限,代表該文件用戶(hù)組具有可寫(xiě)入的權(quán)限。
S_IXGRP 00010 權(quán)限,代表該文件用戶(hù)組具有可執(zhí)行的權(quán)限。
S_IRWXO 00007權(quán)限,代表其他用戶(hù)具有可讀、可寫(xiě)及可執(zhí)行的權(quán)限。
S_IROTH 00004 權(quán)限,代表其他用戶(hù)具有可讀的權(quán)限
S_IWOTH 00002權(quán)限,代表其他用戶(hù)具有可寫(xiě)入的權(quán)限。
S_IXOTH 00001 權(quán)限,代表其他用戶(hù)具有可執(zhí)行的權(quán)限。
返回值
若所有欲核查的權(quán)限都通過(guò)了檢查則返回0 值,表示成功,只要有一個(gè)權(quán)限被禁止則返回-1。
錯(cuò)誤代碼:
EEXIST 參數(shù)pathname 所指的文件已存在,卻使用了O_CREAT和O_EXCL旗標(biāo)。
EACCESS 參數(shù)pathname所指的文件不符合所要求測(cè)試的權(quán)限。
EROFS 欲測(cè)試寫(xiě)入權(quán)限的文件存在于只讀文件系統(tǒng)內(nèi)。
EFAULT 參數(shù)pathname指針超出可存取內(nèi)存空間。
EINVAL 參數(shù)mode 不正確。
ENAMETOOLONG 參數(shù)pathname太長(zhǎng)。
ENOTDIR 參數(shù)pathname不是目錄。
ENOMEM 核心內(nèi)存不足。
ELOOP 參數(shù)pathname有過(guò)多符號(hào)連接問(wèn)題。
EIO I/O 存取錯(cuò)誤。
附加說(shuō)明
使用access()作用戶(hù)認(rèn)證方面的判斷要特別小心,例如在access()后再作open()空文件可能會(huì)造成系統(tǒng)安全上的問(wèn)題。
范例:
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
main()
{
int fd,size;
char s [ ]=”Linux Programmer!\n”,buffer[80];
fd=open(“/tmp/temp”,O_WRONLY|O_CREAT);
write(fd,s,sizeof(s));
close(fd);
fd=open(“/tmp/temp”,O_RDONLY);
size=read(fd,buffer,sizeof(buffer));
close(fd);
printf(“%s”,buffer);
}
執(zhí)行 Linux Programmer!
read(由已打開(kāi)的文件讀取數(shù)據(jù))
相關(guān)函數(shù) readdir,write,fcntl,close,lseek,readlink,fread
表頭文件 #include<unistd.h>
定義函數(shù) ssize_t read(int fd,void * buf ,size_t count);
函數(shù)說(shuō)明 read()會(huì)把參數(shù)fd 所指的文件傳送count個(gè)字節(jié)到buf指針?biāo)傅膬?nèi)存中。若參數(shù)count為0,則read()不會(huì)有作用并返回0。返回值為實(shí)際讀取到的字節(jié)數(shù),如果 返回0,表示已到達(dá)文件尾或是無(wú)可讀取的數(shù)據(jù),此外文件讀寫(xiě)位置會(huì)隨讀取到的字節(jié)移動(dòng)。
返回值
如果順利read()會(huì)返回實(shí)際讀到的字節(jié)數(shù),最好能將返回值與參數(shù)count 作比較,若返回的字節(jié)數(shù)比要求讀取的字節(jié)數(shù)少,則有可能讀到了文件尾、從管道(pipe)或終端機(jī)讀取,或者是read()被信號(hào)中斷了讀取動(dòng)作。當(dāng)有錯(cuò) 誤發(fā)生時(shí)則返回-1,錯(cuò)誤代碼存入errno中,而文件讀寫(xiě)位置則無(wú)法預(yù)期。
錯(cuò)誤代碼
EINTR 此調(diào)用被信號(hào)所中斷。
EAGAIN 當(dāng)使用不可阻斷I/O 時(shí)(O_NONBLOCK),若無(wú)數(shù)據(jù)可讀取則返回此值。
EBADF 參數(shù)fd 非有效的文件描述詞,或該文件已關(guān)閉。
范例 參考o(jì)pen()。
sync(將緩沖區(qū)數(shù)據(jù)寫(xiě)回磁盤(pán))
相關(guān)函數(shù) fsync
表頭文件 #include<unistd.h>
定義函數(shù) int sync(void)
函數(shù)說(shuō)明 sync()負(fù)責(zé)將系統(tǒng)緩沖區(qū)數(shù)據(jù)寫(xiě)回磁盤(pán),以確保數(shù)據(jù)同步。
返回值 返回0。
write(將數(shù)據(jù)寫(xiě)入已打開(kāi)的文件內(nèi))
相關(guān)函數(shù) open,read,fcntl,close,lseek,sync,fsync,fwrite
表頭文件 #include<unistd.h>
定義函數(shù) ssize_t write (int fd,const void * buf,size_t count);
函數(shù)說(shuō)明 write()會(huì)把參數(shù)buf所指的內(nèi)存寫(xiě)入count個(gè)字節(jié)到參數(shù)fd所指的文件內(nèi)。當(dāng)然,文件讀寫(xiě)位置也會(huì)隨之移動(dòng)。
返回值
如果順利write()會(huì)返回實(shí)際寫(xiě)入的字節(jié)數(shù)。當(dāng)有錯(cuò)誤發(fā)生時(shí)則返回-1,錯(cuò)誤代碼存入errno中。
錯(cuò)誤代碼
EINTR 此調(diào)用被信號(hào)所中斷。
EAGAIN 當(dāng)使用不可阻斷I/O 時(shí)(O_NONBLOCK),若無(wú)數(shù)據(jù)可讀取則返回此值。
EADF 參數(shù)fd非有效的文件描述詞,或該文件已關(guān)閉。
范例 請(qǐng)參考o(jì)pen()。
fopen(打開(kāi)文件)
相關(guān)函數(shù) open,fclose
表頭文件 #include<stdio.h>
定義函數(shù) FILE * fopen(const char * path,const char * mode);
函數(shù)說(shuō)明
參數(shù)path字符串包含欲打開(kāi)的文件路徑及文件名,參數(shù)mode字符串則代表著流形態(tài)。
mode有下列幾種形態(tài)字符串:
r 打開(kāi)只讀文件,該文件必須存在。
r+ 打開(kāi)可讀寫(xiě)的文件,該文件必須存在。
w 打開(kāi)只寫(xiě)文件,若文件存在則文件長(zhǎng)度清為0,即該文件內(nèi)容會(huì)消失。若文件不存在則建立該文件。
w+ 打開(kāi)可讀寫(xiě)文件,若文件存在則文件長(zhǎng)度清為零,即該文件內(nèi)容會(huì)消失。若文件不存在則建立該文件。
a 以附加的方式打開(kāi)只寫(xiě)文件。若文件不存在,則會(huì)建立該文件,如果文件存在,寫(xiě)入的數(shù)據(jù)會(huì)被加到文件尾,即文件原先的內(nèi)容會(huì)被保留。
a+ 以附加方式打開(kāi)可讀寫(xiě)的文件。若文件不存在,則會(huì)建立該文件,如果文件存在,寫(xiě)入的數(shù)據(jù)會(huì)被加到文件尾后,即文件原先的內(nèi)容會(huì)被保留。
上述的形態(tài)字符串都可以再加一個(gè)b字符,如rb、w+b或ab+等組合,加入b 字符用來(lái)告訴函數(shù)庫(kù)打開(kāi)的文件為二進(jìn)制文件,而非純文字文件。不過(guò)在POSIX系統(tǒng),包含Linux都會(huì)忽略該字符。由fopen()所建立的新文件會(huì)具 有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)權(quán)限,此文件權(quán)限也會(huì)參考umask 值。
返回值
文件順利打開(kāi)后,指向該流的文件指針就會(huì)被返回。若果文件打開(kāi)失敗則返回NULL,并把錯(cuò)誤代碼存在errno 中。
附加說(shuō)明
一般而言,開(kāi)文件后會(huì)作一些文件讀取或?qū)懭氲膭?dòng)作,若開(kāi)文件失敗,接下來(lái)的讀寫(xiě)動(dòng)作也無(wú)法順利進(jìn)行,所以在fopen()后請(qǐng)作錯(cuò)誤判斷及處理。
轉(zhuǎn)載于:https://www.cnblogs.com/sun-frederick/p/4763306.html
總結(jié)
以上是生活随笔為你收集整理的linux系统——fread()与read()函数族区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 阿木木惊悚派对皮肤稀有吗
- 下一篇: linux常用命令汇总(pwd,echo