日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

linux 的读写操作(转)

發(fā)布時(shí)間:2024/1/17 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 的读写操作(转) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

open():

#include<fcntl.h>?
#include<types.h>
#include<sys/stat.h>/*此頭文件里面定義了mode標(biāo)志*/

int open(const char *path, int oflags);

int open(const char *path, int oflags, mode_t mode);
函數(shù)描述:open建立了一條到文件或設(shè)備的訪問路徑。如果操作成功,它將返回一個(gè)文件描述符,如果失敗,返回-1。

此函數(shù)說明:第一個(gè)參數(shù)表示:路徑名或者文件名。路徑名為絕對(duì)路徑名,文件則是在當(dāng)前工作目錄下的。
???????????? 第二個(gè)參數(shù)表示:打開文件所采取的動(dòng)作。
?? ???????? 可能值:必須指定下面某一種:O_RDONLY(只讀),O_WRONLY(只寫),O_RDWR(可讀可寫)
?? ??? ??? ?可選用值(常用):O_APPEND(寫入的數(shù)據(jù)追加在文件末尾),O_TRUNC(文件長(zhǎng)度設(shè)置為零,丟棄已有內(nèi)容),O_CREAT(如果訪問的文件不存在,則根據(jù)mode值創(chuàng)建文件),O_EXCL(與O_CREAT一起使用。open是一個(gè)原子操作,它只執(zhí)行一個(gè)函數(shù)調(diào)用。使用這個(gè)模式可以防止兩個(gè)程序同時(shí)創(chuàng)建一個(gè)文件,如果文件已經(jīng)存在,open調(diào)用失敗)
?? ?? 第三個(gè)參數(shù)表示:設(shè)置文件訪問權(quán)限的初始值。(與用戶掩碼umask變量有關(guān),實(shí)際的訪問權(quán)限有mode & ~umask確定)
?? ??? ?S_IRUSR,S_IWUSER,S_IXUSR,S_IRGRP,S_IWGRP,S_IXGRP,S_IROTH,S_IWOTH,S_IXOTH.其中I:,R:讀,W:寫,X:執(zhí)行,USR:文件所屬的用戶,GRP:文件所屬的組,OTH:其他用戶。

注:第三個(gè)參數(shù)是在第二個(gè)參數(shù)中有O_CREAT時(shí)才用作用。若沒有,則第三個(gè)參數(shù)可以忽略。

open函數(shù)與fopen函數(shù)的差別:creat open,close,read,write,lseek等系統(tǒng)調(diào)用是使用底層文件描述符來標(biāo)識(shí)文件,而文件描述符特定的存在于unix/linux中,不方便移植。fopen,fclose,fread,fseek屬于c語言I/O標(biāo)準(zhǔn)庫中的函數(shù)。編寫跨平臺(tái)程序時(shí),用標(biāo)準(zhǔn)庫函數(shù)比較方便移植。

?

read()_write():


read
函數(shù)從打開的設(shè)備或文件中讀取數(shù)據(jù)。

#include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 返回值:成功返回讀取的字節(jié)數(shù),出錯(cuò)返回-1并設(shè)置errno,如果在調(diào)read之前已到達(dá)文件末尾,則這次read返回0

?

參數(shù)
count
是請(qǐng)求讀取的字節(jié)數(shù),讀上來的數(shù)據(jù)保存在緩沖區(qū)
buf
中,同時(shí)文件的當(dāng)前讀寫位置向后移。注意這個(gè)讀寫位置和使用C標(biāo)準(zhǔn)I/O庫時(shí)的讀寫位置有可能不同,這個(gè)讀寫位置是記在內(nèi)核中的,而使用C標(biāo)準(zhǔn)I/O庫時(shí)的讀寫位置是用戶空間I/O緩沖區(qū)中的位置。比如用
fgetc
讀一個(gè)字節(jié),
fgetc
有可能從內(nèi)核中預(yù)讀1024個(gè)字節(jié)到I/O緩沖區(qū)中,再返回第一個(gè)字節(jié),這時(shí)該文件在內(nèi)核中記錄的讀寫位置是1024,而在
FILE
結(jié)構(gòu)體中記錄的讀寫位置是1。注意返回值類型是
ssize_t
,表示有符號(hào)的
size_t
,這樣既可以返回正的字節(jié)數(shù)、0(表示到達(dá)文件末尾)也可以返回負(fù)值-1(表示出錯(cuò))。
read
函數(shù)返回時(shí),返回值說明了
buf
中前多少個(gè)字節(jié)是剛讀上來的。有些情況下,實(shí)際讀到的字節(jié)數(shù)(返回值)會(huì)小于請(qǐng)求讀的字節(jié)數(shù)
count
,例如:


?

讀常規(guī)文件時(shí),在讀到
count
個(gè)字節(jié)之前已到達(dá)文件末尾。例如,距文件末尾還有30個(gè)字節(jié)而請(qǐng)求讀100個(gè)字節(jié),則
read
返回30,下次
read
將返回0。


?

從終端設(shè)備讀,通常以行為單位,讀到換行符就返回了。


?

從網(wǎng)絡(luò)讀,根據(jù)不同的傳輸層協(xié)議和內(nèi)核緩存機(jī)制,返回值可能小于請(qǐng)求的字節(jié)數(shù),后面socket編程部分會(huì)詳細(xì)講解。


?


write
函數(shù)向打開的設(shè)備或文件中寫數(shù)據(jù)。

#include <unistd.h> ssize_t write(int fd, const void *buf, size_t count); 返回值:成功返回寫入的字節(jié)數(shù),出錯(cuò)返回-1并設(shè)置errno

寫常規(guī)文件時(shí),
write
的返回值通常等于請(qǐng)求寫的字節(jié)數(shù)
count
,而向終端設(shè)備或網(wǎng)絡(luò)寫則不一定。

讀常規(guī)文件是不會(huì)阻塞的,不管讀多少字節(jié),
read
一定會(huì)在有限的時(shí)間內(nèi)返回。從終端設(shè)備或網(wǎng)絡(luò)讀則不一定,如果從終端輸入的數(shù)據(jù)沒有換行符,調(diào)用
read
讀終端設(shè)備就會(huì)阻塞,如果網(wǎng)絡(luò)上沒有接收到數(shù)據(jù)包,調(diào)用
read
從網(wǎng)絡(luò)讀就會(huì)阻塞,至于會(huì)阻塞多長(zhǎng)時(shí)間也是不確定的,如果一直沒有數(shù)據(jù)到達(dá)就一直阻塞在那里。同樣,寫常規(guī)文件是不會(huì)阻塞的,而向終端設(shè)備或網(wǎng)絡(luò)寫則不一定。

現(xiàn)在明確一下阻塞(Block)這個(gè)概念。當(dāng)進(jìn)程調(diào)用一個(gè)阻塞的系統(tǒng)函數(shù)時(shí),該進(jìn)程被置于睡眠(Sleep)狀態(tài),這時(shí)內(nèi)核調(diào)度其它進(jìn)程運(yùn)行,直到該進(jìn)程等待的事件發(fā)生了(比如網(wǎng)絡(luò)上接收到數(shù)據(jù)包,或者調(diào)用
sleep
指定的睡眠時(shí)間到了)它才有可能繼續(xù)運(yùn)行。與睡眠狀態(tài)相對(duì)的是運(yùn)行(Running)狀態(tài),在Linux內(nèi)核中,處于運(yùn)行狀態(tài)的進(jìn)程分為兩種情況:


?

正在被調(diào)度執(zhí)行。CPU處于該進(jìn)程的上下文環(huán)境中,程序計(jì)數(shù)器(
eip
)里保存著該進(jìn)程的指令地址,通用寄存器里保存著該進(jìn)程運(yùn)算過程的中間結(jié)果,正在執(zhí)行該進(jìn)程的指令,正在讀寫該進(jìn)程的地址空間。


?

就緒狀態(tài)。該進(jìn)程不需要等待什么事件發(fā)生,隨時(shí)都可以執(zhí)行,但CPU暫時(shí)還在執(zhí)行另一個(gè)進(jìn)程,所以該進(jìn)程在一個(gè)就緒隊(duì)列中等待被內(nèi)核調(diào)度。系統(tǒng)中可能同時(shí)有多個(gè)就緒的進(jìn)程,那么該調(diào)度誰執(zhí)行呢?內(nèi)核的調(diào)度算法是基于優(yōu)先級(jí)和時(shí)間片的,而且會(huì)根據(jù)每個(gè)進(jìn)程的運(yùn)行情況動(dòng)態(tài)調(diào)整它的優(yōu)先級(jí)和時(shí)間片,讓每個(gè)進(jìn)程都能比較公平地得到機(jī)會(huì)執(zhí)行,同時(shí)要兼顧用戶體驗(yàn),不能讓和用戶交互的進(jìn)程響應(yīng)太慢。

?

close():

?close函數(shù)(關(guān)閉文件)
此系統(tǒng)調(diào)用功能,恰好運(yùn)行與open調(diào)用相反的操作,即告訴系統(tǒng)關(guān)閉一些不再使用的文件。
它的使用格式如下:
retval = close(handle) ;
如果調(diào)用成功,則系統(tǒng)返回0給變量retval,否則返回-1,也可直接寫成:
close(handle) ;
不過,使用這種方式關(guān)閉文件會(huì)造成無法從系統(tǒng)的返回值retval判定系統(tǒng)是否成功地關(guān)閉了這個(gè)文件。

程序應(yīng)用:

/*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>
#define MAXSIZE? 128
int main(void)
{
?int i,fd,size,len;
?char *buf="Hello! I'm writing to this file!";
?char buf_r[10];
?
?len = strlen(buf);
?buf_r[10] = '\0';
?if((fd = open("/mnt/hgfs/Source/hello.c", O_CREAT | O_TRUNC | O_RDWR,0666 ))<0)
?{
??perror("open:");
??exit(1);
?}
?else
??printf("open file:hello.c %d\n",fd);

?if((size = write( fd, buf, len)) < 0){
??perror("write:");
??exit(1);
?}
?else
??printf("Write:%s\n",buf);

?? //??? lseek( fd, 0, SEEK_SET );? //即把文件指針移至buf文件的開始處
??????????????? lseek( fd, -10, SEEK_END);? //即把文件指針往前移動(dòng)10個(gè)字符
?if((size = read( fd, buf_r, 10))<0)
?{?
??perror("read:");
??exit(1);
?}
?else
??printf("read form file:%s\n",buf_r);
?
?if( close(fd) < 0 )
?{
??perror("close:");
??exit(1);
?}
?else
??printf("Close hello.c\n");
?
?exit(0);
}

轉(zhuǎn)載于:https://www.cnblogs.com/dc2011/archive/2012/02/23/2365043.html

總結(jié)

以上是生活随笔為你收集整理的linux 的读写操作(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。