#include <sys> #include <sys> #include int open(const char *pathname, int flags); </sys></sys>
參數1:pathname,檔案所在路徑
參數2:flags,檔案權限,相對於程式進程
常見巨集為:O_WRONLY,O_RDONLY,O_RDWR,O_EXCL,O_APPEND,O_DUMP
參數3:mode,建立檔案時候使用,一般為umask的值。
傳回值: 成功返回檔案描述符,否則返回-1.
#include int close(int fd);
#include ssize_t write(int fd, const void *buf, size_t count);
fd: 檔案描述符
buf:儲存將要寫的資料
count: 寫入的長度,以位元組為單位
傳回值:寫入成功時,傳回寫入的字元長度,否則傳回-1。
#include ssize_t read(int fd, void *buf, size_t count);
fd: 檔案描述符
buf:儲存將要讀入的資料
count: 讀出的長度,以位元組為單位
傳回值:讀取成功時,返回讀出的字元長度,否則返回-1。
例如:
#include
#include <sys> #include <unistd.h off_t lseek fd offset int whence> <p>fd: 檔案描述符<br> offset:將要偏移 的位元組數。 <br> whence:從那開始偏移,巨集定義如下:<br> SEEK_END 檔案結尾<br> SEEK_CUR 目前偏移量位置<br> SEEK_SET 檔案開頭位置<br> 注意:當偏移量大於檔案長度時,產生空洞,空洞是由所設定的偏移量超過檔案尾端,並寫了一些資料造成了,其從原始檔案尾端到新偏移的位置之間即是產生的空洞。空洞不佔用磁碟空間,可以使用:</p> <pre class="brush:php;toolbar:false">du filename #查看文件所占实际磁盘空间 ls filename #实际文件的大小
例如:
#include #include #include #include <sys> #include <sys> #include #define BUFF 12 int main() { char str1[BUFF] = "jigntikai"; char str2[BUFF] = "wojisuhihawe"; int fd; if ( (fd = open("a.txt",O_WRONLY|O_CREAT,0744)) = { perror("open file fail\n"); exit(EXIT_FAILURE); } if( write(fd,str1,BUFF) == -1 ) { perror("write fial fail\n"); exit(EXIT_FAILURE); } if( lseek(fd,1024,SEEK_END) == -1 ) { perror("lseek fail\n"); } write(fd,str2,BUFF); return 0; } </sys></sys>
#include int access(const char *pathname, int mode);
pathname: 檔名
mode 可以選擇以下巨集:
F_OK 檔案是否存在
R_OK 檔案否具有讀取權限
X_OK 檔案否具有可執行權限
W_OK 檔案否具有寫入權限
傳回值:滿足mode中的參數並且正確執行則傳回0 ,否則回傳-1。
#include int dup(int oldfd);
oldfd:原來的檔案描述子
newfd:指定新的檔案描述符數值,如果描述已經存在則先將其關閉,若oldfd等於newfd,ze返回newfd,而不關閉。
在此簡單介紹一下檔案的核心結構:首先在電腦系統中有一個進程表,其中的每個進程表項,該表項中有一個開啟檔案描述符表,該開啟的檔案描述表中有很多檔案描述符表項,每項包括兩部分:文件描述符標誌與文件指針,其中文件指針指向一個文件表,文件表中存放著文件的狀態標誌即是否可讀是否可寫,當前文件的偏移量,還有一個v節點指針,指針v節點指針指向一個v節點表,v節點表主要存放文件的擁有者,文件長度,文件的設備以及文件實際資料塊在磁碟上的位置等一系列資訊。可能這樣描不太清楚,下面用一張圖來描述:
(对于以下会主要是针对的内核缓冲)由于io操作会首先将数据放入内核缓冲区,所以在写的时候如果出现系统故障则缓冲区的数据可能会丢失,所以为了防止这种情况发生,以上两个函数使得内核缓冲区的数据立即写入磁盘。
#include void sync(void);将所有缓冲排入写队列,然后立即返回 int fsync(int fd);将所有缓冲排入写队列,直到该缓冲去的数据写入磁盘后才返回。 int fdatasync(int fd);几乎和fsync函数相同,只是fdatasync(int fd)函数只影响数据部分,而fsync还会同步更新文件的属性。
#include #include int fcntl(int fd, int cmd, ... /* arg */ );
fd:文件描述符
cmd 指明该函数执行什么功能
F_DUPFD 赋值文件描述符,功能相当于dup和dup2函数。例如:
dup(fd)等价于
fcntl(fd,F_DUPFD,0)
dup2(oldfd,newfd)等价于
close(newfd);
fcntl(oldfd,F_DUPFD,newfd);
F_GETFD 的到文件描述符标志,当前之定义一个文件描述符标志,FD_CLOSEEXEC.此时第三个参数被忽视。
F_SETFD 设置文件描述符标志,设置的值是函数的第三个参数,其一般可设置为0表示关闭,1表示打开。
F_SETFL 设置文件状态标志,其值放在函数的第三个参数,和open函数第二个参数的值一样的。
F_GETFL 得到文件状态标志。此时第三个参数被忽视。
arg 可选参数,根据第二个参数填写。
返回值:出错返回-1,否则哈返达到的标志。
例如:
#include #include #include #include int main(int argc,char * argv[]) { int fd; int val=3; if( (fd = open(argv[1],O_RDWR|O_APPEND)) == -1 )//测试一下是否可以同时检测出文件的读写属性 { exit(2); } if( val = fcntl(fd,F_GETFL,0) == -1 ) { exit(1); } printf("%d\n",val); printf("%d %d %d\n",O_RDONLY,O_WRONLY,O_RDWR); int n = val & O_ACCMODE; if( n == O_RDONLY) printf("read\n"); if(O_WRONLY & val ) printf("write\n"); if( n == O_RDWR) printf("read and write\n"); }
linux中有两个级别的缓冲:IO缓冲与内核缓冲
(1)IO缓冲:对于标准IO操作,都会有一个缓冲区,当用户想要写数据时,首先将数据写入缓冲区,待缓冲区满之后才能调用系统函数写入内核缓冲区。当用户想读取数据时,首先向内核读取一定的数据放入IO缓冲区,读操作从缓冲区中读数据,当读完IO缓冲区的数据时,才能再读取数据到IO缓冲区。
目的:减少对磁盘的读写次数,提高工作效率。
(2)内核缓冲区:操作系统内核部分也有缓冲,其与IO缓冲区是不同的,其主要区别用一张图表示:
以上是Linux下的檔案I/O編程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

簡介:通過基於Linux的道德黑客攻擊數字邊界 在我們越來越相互聯繫的世界中,網絡安全至關重要。 道德黑客入侵和滲透測試對於主動識別和減輕脆弱性至關重要

Linux基礎學習從零開始的方法包括:1.了解文件系統和命令行界面,2.掌握基本命令如ls、cd、mkdir,3.學習文件操作,如創建和編輯文件,4.探索高級用法如管道和grep命令,5.掌握調試技巧和性能優化,6.通過實踐和探索不斷提陞技能。

Linux在服務器、嵌入式系統和桌面環境中的應用廣泛。 1)在服務器領域,Linux因其穩定性和安全性成為託管網站、數據庫和應用的理想選擇。 2)在嵌入式系統中,Linux因其高度定制性和高效性而受歡迎。 3)在桌面環境中,Linux提供了多種桌面環境,滿足不同用戶需求。

Linux的缺點包括用戶體驗、軟件兼容性、硬件支持和學習曲線。 1.用戶體驗不如Windows或macOS友好,依賴命令行界面。 2.軟件兼容性不如其他系統,缺乏許多商業軟件的原生版本。 3.硬件支持不如Windows全面,可能需要手動編譯驅動程序。 4.學習曲線較陡峭,掌握命令行操作需要時間和耐心。

Linuxisnothardtolearn,butthedifficultydependsonyourbackgroundandgoals.ForthosewithOSexperience,especiallycommand-linefamiliarity,Linuxisaneasytransition.Beginnersmayfaceasteeperlearningcurvebutcanmanagewithproperresources.Linux'sopen-sourcenature,bas

Linux的五個基本組件是:1.內核,管理硬件資源;2.系統庫,提供函數和服務;3.Shell,用戶與系統交互的接口;4.文件系統,存儲和組織數據;5.應用程序,利用系統資源實現功能。

開啟智能家居新篇章:基於Ubuntu的開源家庭自動化系統 智能家居技術徹底改變了我們與生活空間的互動方式,為日常生活帶來了便利、安全和能源效率。從遠程控制燈光和電器,到監控安全攝像頭和自動化氣候控制,智能家居技術變得越來越普及。 然而,許多商業智能家居系統存在局限性:高昂的成本、隱私問題以及有限的兼容性。幸運的是,開源軟件解決方案結合Ubuntu的強大功能,提供了一種替代方案——允許用戶創建可定制、經濟高效且安全的智能家居生態系統。 本指南將探討如何使用Ubuntu和開源工具設置家庭自動化系統。

Linux與Windows:2025比較 考慮從MacOS或Windows切換? Linux可能是答案。 儘管MacOS用戶會發現相對平滑的過渡(由於MacOS的UNIX Core),但Windows用戶需要適應。此指南HIG


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver Mac版
視覺化網頁開發工具

記事本++7.3.1
好用且免費的程式碼編輯器