- read系統呼叫
一旦有了與一個開啟檔案描述相連的檔案描述符,只要該檔案是用O_RDONLY或O_RDWR標誌開啟的,就可以用read()系統呼叫從該檔案中讀取位元組
函式原型:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
引數
fd :想要讀的檔案的檔案描述符
buf : 指向記憶體塊的指標,從檔案中讀取來的位元組放到這個記憶體塊中
count : 從該檔案複製到buf中的位元組個數
返回值
如果出現錯誤,返回-1
讀檔案結束,返回0
否則返回從該檔案複製到規定的緩衝區中的位元組數
否則返回從該檔案複製到規定的緩衝區中的位元組數
- write系統呼叫
用write()系統呼叫將資料寫到一個檔案中
函式原型:
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
函式引數:
-fd:要寫入的檔案的檔案描述符
-buf:指向記憶體塊的指標,從這個記憶體塊中讀取資料寫入 到檔案中
-count:要寫入檔案的位元組個數
返回值
如果出現錯誤,返回-1
注:write並非真正寫入磁碟,而是先寫入記憶體緩衝區,待緩衝區滿或進行重新整理操作後才真正寫入磁碟,若想實時寫入磁碟可呼叫
int fsync(int fd);或在open時flags加上O_SYNC
-
利用read和write進行檔案拷貝
程式程式碼:
-
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #define EXIT_ERR(m) \ do{\ perror(m);\ exit(EXIT_FAILURE);\ }while(0) int main(int argc, char **argv) { int infd; int outfd; if(argc != 3){ fprintf(stderr,"usage:%s src des\n",argv[0]); exit(EXIT_FAILURE); } if((infd = open(argv[1],O_RDONLY)) == -1) EXIT_ERR("open error"); if((outfd = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0644)) == -1) EXIT_ERR("OPEN ERROR"); char buf[1024]; int n; while((n = read(infd, buf, 1024)) > 0 ){ write(outfd, buf, n); } close(infd); close(outfd); return 0; }
測試結果: