Linux下的檔案I/O編程
#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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

CentOS 和 Ubuntu 的關鍵差異在於:起源(CentOS 源自 Red Hat,面向企業;Ubuntu 源自 Debian,面向個人)、包管理(CentOS 使用 yum,注重穩定;Ubuntu 使用 apt,更新頻率高)、支持週期(CentOS 提供 10 年支持,Ubuntu 提供 5 年 LTS 支持)、社區支持(CentOS 側重穩定,Ubuntu 提供廣泛教程和文檔)、用途(CentOS 偏向服務器,Ubuntu 適用於服務器和桌面),其他差異包括安裝精簡度(CentOS 精

CentOS 安裝步驟:下載 ISO 映像並刻錄可引導媒體;啟動並選擇安裝源;選擇語言和鍵盤佈局;配置網絡;分區硬盤;設置系統時鐘;創建 root 用戶;選擇軟件包;開始安裝;安裝完成後重啟並從硬盤啟動。

CentOS將於2024年停止維護,原因是其上游發行版RHEL 8已停止維護。該停更將影響CentOS 8系統,使其無法繼續接收更新。用戶應規劃遷移,建議選項包括CentOS Stream、AlmaLinux和Rocky Linux,以保持系統安全和穩定。

Docker利用Linux內核特性,提供高效、隔離的應用運行環境。其工作原理如下:1. 鏡像作為只讀模板,包含運行應用所需的一切;2. 聯合文件系統(UnionFS)層疊多個文件系統,只存儲差異部分,節省空間並加快速度;3. 守護進程管理鏡像和容器,客戶端用於交互;4. Namespaces和cgroups實現容器隔離和資源限制;5. 多種網絡模式支持容器互聯。理解這些核心概念,才能更好地利用Docker。

CentOS 已停止維護,替代選擇包括:1. Rocky Linux(兼容性最佳);2. AlmaLinux(與 CentOS 兼容);3. Ubuntu Server(需要配置);4. Red Hat Enterprise Linux(商業版,付費許可);5. Oracle Linux(與 CentOS 和 RHEL 兼容)。在遷移時,考慮因素有:兼容性、可用性、支持、成本和社區支持。

CentOS 停止維護後,用戶可以採取以下措施應對:選擇兼容髮行版:如 AlmaLinux、Rocky Linux、CentOS Stream。遷移到商業發行版:如 Red Hat Enterprise Linux、Oracle Linux。升級到 CentOS 9 Stream:滾動發行版,提供最新技術。選擇其他 Linux 發行版:如 Ubuntu、Debian。評估容器、虛擬機或云平台等其他選項。

如何使用 Docker Desktop? Docker Desktop 是一款工具,用於在本地機器上運行 Docker 容器。其使用步驟包括:1. 安裝 Docker Desktop;2. 啟動 Docker Desktop;3. 創建 Docker 鏡像(使用 Dockerfile);4. 構建 Docker 鏡像(使用 docker build);5. 運行 Docker 容器(使用 docker run)。

VS Code擴展安裝失敗的原因可能包括:網絡不穩定、權限不足、系統兼容性問題、VS Code版本過舊、殺毒軟件或防火牆干擾。通過檢查網絡連接、權限、日誌文件、更新VS Code、禁用安全軟件以及重啟VS Code或計算機,可以逐步排查和解決問題。
